【JAVA】Java 访问修饰符:public、protected、private 对比
·
Java 里的 public、protected、private 叫做访问修饰符,作用是控制:
一个类、变量、方法能被谁访问。
可以先记住一句话:
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();
}
}
输出:
你好,我叫 张三
因为 name 和 sayHello() 都是 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:受保护的,同一个包能访问,子类也能访问
protected 比 private 开放一些,但又没有 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();
}
}
输出:
小狗 正在吃东西
这里 Dog 是 Animal 的子类,所以可以访问父类中的 protected name 和 protected 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
更多推荐


所有评论(0)