Java四种访问权限修饰符详解
1. 权限修饰符
Java 中的访问权限修饰符有以下四种:
public
protected
default
(默认,不写)private
它们决定了类、接口、方法和变量在不同范围内的可见性。
2. 权限修饰符可修饰的内容
可修饰项 | 可用修饰符 |
---|---|
类 | public 、default |
接口 | public 、default |
方法 | public 、protected 、default 、private |
变量 | public 、protected 、default 、private |
⚠️ 注意:
- 局部变量、方法参数、构造器参数不能使用访问权限修饰符。
- 类和接口只能使用
public
和default
。
3. 访问权限分类
范围 | public | protected | default | private |
---|---|---|---|---|
同一个类 | ✅ | ✅ | ✅ | ✅ |
同一个包 | ✅ | ✅ | ✅ | ❌ |
不同包子类 | ✅ | ✅ | ❌ | ❌ |
其他类 | ✅ | ❌ | ❌ | ❌ |
4. 访问权限举例说明
4.1 public - 任意类
public
成员可以在任意类中访问,不受包和继承关系限制。
public class Animal {public void speak() {System.out.println("Animal speaks");}
}public class Test {public static void main(String[] args) {Animal animal = new Animal();animal.speak(); // 正常调用}
}
4.2 protected - 同包 / 不同包子类
protected
成员可以被:
- 同一包中的所有类访问;
- 不同包中的子类访问(通过继承)。
示例结构
com.example.animal└── Animal.java
com.example.child└── Child.java
Animal.java
package com.example.animal;public class Animal {protected String name = "Animal";protected void sayHello() {System.out.println("Hello from " + name);}
}
Child.java
package com.example.child;import com.example.animal.Animal;public class Child extends Animal {public void showInfo() {System.out.println(name); // 子类访问 protected 字段sayHello(); // 子类访问 protected 方法}
}
4.3 default - 同包
没有显式指定访问权限时,默认为 default
。该成员只能在定义它的包内访问。
示例结构
com.example.animal└── Animal.java└── Dog.java
com.example.other└── OtherClass.java
Animal.java
package com.example.animal;class Animal { // 默认访问权限String name = "Animal";void display() {System.out.println("This is an " + name);}
}
Dog.java
package com.example.animal;public class Dog {public void showName() {Animal animal = new Animal();System.out.println(animal.name); // 同包下可访问animal.display(); // 同包下可访问}
}
OtherClass.java(不同包)
package com.example.other;import com.example.animal.Animal;public class OtherClass {public void tryAccess() {Animal animal = new Animal();// 编译错误:无法访问 default 成员// System.out.println(animal.name);// animal.display();}
}
4.4 private - 同类
private
是最严格的访问控制级别,只能在定义它的类内部访问,对外完全隐藏。
示例代码
public class Person {private String name = "John";private void sayHello() {System.out.println("Hello, my name is " + name);}public void introduce() {sayHello(); // 同类中可以访问}public static void main(String[] args) {Person p = new Person();p.introduce(); // 正常调用}
}
外部类访问失败示例
public class OtherClass {public void accessPrivate() {Person person = new Person();// 下面两行会编译报错// System.out.println(person.name);// person.sayHello();}
}
✅ 总结:
private
成员仅能在定义它的类内部访问;- 子类、同包类、外部类均无法访问;
- 常用于封装数据,防止外部直接修改对象状态。
5. 总结对比表
修饰符 | 同类 | 同包 | 子类 | 外部类 |
---|---|---|---|---|
public | ✅ | ✅ | ✅ | ✅ |
protected | ✅ | ✅ | ✅ | ❌ |
default | ✅ | ✅ | ❌ | ❌ |
private | ✅ | ❌ | ❌ | ❌ |