在 Java 中,public
、private
和 protected
是三种用于修饰类成员(包括方法和变量)的访问修饰符。它们主要用于控制成员的访问范围和可见性。
public
- 访问范围:可以被任何地方访问,包括同一个类、同一个包中的其他类、不同包中的类。
- 使用场景:当你希望该方法对所有类开放,无论它们位于哪个包中,都可以使用
public
修饰符。 - 示例:
public class Example {
public void publicMethod() {
System.out.println("This is a public method.");
}
}
private
- 访问范围:只能在定义它的类内部访问,不能在类的外部访问。
- 使用场景:当你希望该方法只在类的内部使用,不希望其他类(包括子类)访问时,可以使用
private
修饰符。 - 示例:
public class Example {
private void privateMethod() {
System.out.println("This is a private method.");
}
public void accessPrivateMethod() {
privateMethod(); // 合法
}
}
protected
- 访问范围:
- 同一个类内部可以访问。
- 同一个包中的其他类可以访问。
- 子类可以访问,无论子类是否在同一个包中。
- 使用场景:当你希望该方法在包内或通过继承关系在子类中使用,而不希望其他非子类的类访问时,可以使用
protected
修饰符。 - 示例:
public class Example {
protected void protectedMethod() {
System.out.println("This is a protected method.");
}
}
// 同一个包中的其他类可以访问
class AnotherClassInSamePackage {
public void accessProtectedMethod() {
Example example = new Example();
example.protectedMethod(); // 合法
}
}
// 不同包中的子类可以访问
package com.example.child;
import com.example.Example;
public class Child extends Example {
public void accessProtectedMethod() {
protectedMethod(); // 合法
}
}
访问修饰符的比较总结
修饰符 | 同一个类 | 同一个包 | 子类(同包) | 子类(不同包) | 不同包的非子类 |
---|---|---|---|---|---|
public | 可以 | 可以 | 可以 | 可以 | 可以 |
protected | 可以 | 可以 | 可以 | 可以 | 不可以 |
no modifier (default) | 可以 | 可以 | 可以 | 不可以 | 不可以 |
private | 可以 | 不可以 | 不可以 | 不可以 | 不可以 |
选择合适修饰符的指南
- public:当你希望方法被所有类访问时使用。
- protected:当你希望方法被同一包内的类和所有子类访问时使用。
- default(无修饰符):当你希望方法仅被同一包内的类访问时使用。
- private:当你希望方法仅在当前类内部使用时使用。