1. public
访问限定符
- 作用:当一个类、方法或变量被声明为
public
时,它在所有地方都是可见的。任何类都可以访问它,无论它们是否在同一个包中。 - 使用场景:当你希望某个类或成员可以被任何其他类访问时,使用
public
。
示例:
public class Example {
public int publicField = 10;
public void publicMethod() {
System.out.println("This is a public method.");
}
}
位置 | 同一个类 | 同一个包 | 子类 | 任何地方 |
---|---|---|---|---|
public | ✔️ | ✔️ | ✔️ | ✔️ |
2. protected
访问限定符
- 作用:
protected
修饰的成员可以在同一个包中的类以及子类中访问(包括不同包中的子类)。但是,如果不在同一个包且不是子类,则不能访问。 - 使用场景:当你希望某个成员对同包内的类和继承该类的子类开放访问时,使用
protected
。
示例:
public class Example {
protected int protectedField = 20;
protected void protectedMethod() {
System.out.println("This is a protected method.");
}
}
子类:
public class Subclass extends Example {
public void accessProtected() {
System.out.println(protectedField); // 子类可以访问protected成员
protectedMethod(); // 子类可以调用protected方法
}
}
访问权限图:
位置 | 同一个类 | 同一个包 | 子类 | 任何地方 |
---|---|---|---|---|
protected | ✔️ | ✔️ | ✔️(包括不同包的子类) | ❌ |
3. 默认(包级别)访问权限
- 作用:当没有指定访问限定符时,Java使用默认(包级别)的访问权限,也称为包私有(Package-private)。这种情况下,成员只能在同一个包内的类中访问,不能被其他包中的类访问。
- 使用场景:当你希望类或成员只在同一包中使用,而不希望被其他包中的类访问时,使用默认权限。
示例:
class Example {
int defaultField = 30;
void defaultMethod() {
System.out.println("This is a default access method.");
}
}
访问权限图:
位置 | 同一个类 | 同一个包 | 子类 | 任何地方 |
---|---|---|---|---|
默认 | ✔️ | ✔️ | ❌(不同包的子类) | ❌ |
4. private
访问限定符
- 作用:
private
成员只能在所属类内部访问,其他类(包括子类和同包中的类)都不能访问。即使是子类也无法继承或访问private
成员。 - 使用场景:当你希望某个成员完全封装在类内部,不允许其他类或对象访问时,使用
private
。
示例:
public class Example {
private int privateField = 40;
private void privateMethod() {
System.out.println("This is a private method.");
}
public void accessPrivate() {
System.out.println(privateField); // 在类内部访问
privateMethod(); // 类内部可以访问private成员
}
}
访问权限图:
位置 | 同一个类 | 同一个包 | 子类 | 任何地方 |
---|---|---|---|---|
private | ✔️ | ❌ | ❌ | ❌ |
5. 访问权限总结
访问限定符 | 同一个类 | 同一个包 | 子类(不同包) | 任何地方 |
---|---|---|---|---|
public | ✔️ | ✔️ | ✔️ | ✔️ |
protected | ✔️ | ✔️ | ✔️ | ❌ |
默认 | ✔️ | ✔️ | ❌ | ❌ |
private | ✔️ | ❌ | ❌ | ❌ |