Java 里的 publicprotectedprivate 叫做访问修饰符,作用是控制:

一个类、变量、方法能被谁访问。

可以先记住一句话:

public    :谁都能用
protected :同包能用,子类也能用
private   :只有自己这个类内部能用

1. public:公开的,哪里都能访问

比如有一个学生类:

public class Student {
    public String name;

    public void sayHello() {
        System.out.println("你好,我叫 " + name);
    }
}

在另一个类中可以直接访问:

public class Main {
    public static void main(String[] args) {
        Student s = new Student();

        s.name = "张三";
        s.sayHello();
    }
}

输出:

你好,我叫 张三

因为 namesayHello() 都是 public,所以外部可以直接使用。


2. private:私有的,只有当前类自己能访问

看这个例子:

class Student {
    private String name;

    public void setName(String n) {
        name = n;
    }

    public void sayHello() {
        System.out.println("你好,我叫 " + name);
    }
}

外部不能直接访问 name

public class Main {
    public static void main(String[] args) {
        Student s = new Student();

        s.name = "张三"; // 错误:name 是 private
    }
}

正确做法是通过公开方法访问:

public class Main {
    public static void main(String[] args) {
        Student s = new Student();

        s.setName("张三");
        s.sayHello();
    }
}

输出:

你好,我叫 张三

这就是 Java 里常说的封装

成员变量用 private 保护起来,外部通过 public 方法间接访问。


3. protected:受保护的,同一个包能访问,子类也能访问

protectedprivate 开放一些,但又没有 public 那么开放。

先看一个父类:

class Animal {
    protected String name;

    protected void eat() {
        System.out.println(name + " 正在吃东西");
    }
}

子类可以访问父类的 protected 成员:

class Dog extends Animal {
    public void show() {
        name = "小狗";
        eat();
    }
}

主程序:

public class Main {
    public static void main(String[] args) {
        Dog d = new Dog();
        d.show();
    }
}

输出:

小狗 正在吃东西

这里 DogAnimal 的子类,所以可以访问父类中的 protected nameprotected eat()


4. 三者对比

修饰符 当前类 同一个包 子类 其他包普通类
public 可以 可以 可以 可以
protected 可以 可以 可以 不可以
private 可以 不可以 不可以 不可以

再加一个默认情况:

如果你什么都不写,比如:

String name;

它是默认访问权限,也叫 package-private

修饰符 当前类 同一个包 子类 其他包普通类
不写 可以 可以 不一定 不可以

5. 用“宿舍”打比方

可以这样理解:

private   :只有你自己能看,比如你的手机密码
protected :家人/同门可以看,比如宿舍内部资料
public    :所有人都能看,比如公开公告

放到代码里:

class Student {
    private String password;   // 密码,只能自己类内部用
    protected String dormName; // 宿舍名,同包或子类可用
    public String schoolName;  // 学校名,外部都可用
}

6. 实际开发中怎么用?

初学阶段可以先记住这几个习惯:

成员变量一般用 private

class Student {
    private String name;
    private int age;
}

不要随便让外部直接修改对象内部数据。


对外提供 public 方法

class Student {
    private String name;

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

使用:

public class Main {
    public static void main(String[] args) {
        Student s = new Student();

        s.setName("张三");
        System.out.println(s.getName());
    }
}

protected 常用于继承

比如父类中有些方法不想给所有人用,但希望子类能用:

class Animal {
    protected void breathe() {
        System.out.println("呼吸");
    }
}

class Dog extends Animal {
    public void run() {
        breathe();
        System.out.println("小狗在跑");
    }
}

7. 最推荐记住的写法

class Student {
    private String name;
    private int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void showInfo() {
        System.out.println(name + "," + age + "岁");
    }
}

这个结构最常见:

属性:private
构造方法:public
对外方法:public
给子类用的方法:protected
内部辅助方法:private

更多推荐