在 Java 中,访问修饰符(Access Modifiers)用于控制类、方法、变量和构造器的访问权限。Java 提供了四种访问修饰符,分别是:
- public
- protected
- default(包私有,没有显式修饰符)
- private
public
- 访问范围:最大范围的访问权限。
- 作用:
- 被 public 修饰的类、方法、变量或构造器可以在任何地方访问。
- 如果类是 public,则类名必须与文件名一致。
public class MyClass {public int myVar;public void myMethod() {System.out.println("Public Method");}
}
protected
- 访问范围:
- 同一包内的类可以访问。
- 不同包中的子类可以访问。
- 作用:
- 主要用于继承场景,允许子类访问父类的成员。
package com.example;public class Parent {protected int myVar;protected void myMethod() {System.out.println("Protected Method");}
}package com.another;import com.example.Parent;public class Child extends Parent {void accessParent() {myVar = 10; // 可以访问 protected 变量myMethod(); // 可以访问 protected 方法}
}
default(包私有)
- 访问范围:
- 同一包内的类可以访问。
- 不同包中的类无法访问。
- 作用:
- 如果不显式指定访问修饰符,则默认为 default。
package com.example;class MyClass {int myVar; // default 访问权限void myMethod() {System.out.println("Default Method");}
}
private
- 访问范围:
- 仅限当前类内部访问。
- 作用:
- 用于封装类的内部实现细节,防止外部直接访问。
public class MyClass {private int myVar;private void myMethod() {System.out.println("Private Method");}public void setMyVar(int value) {this.myVar = value; // 可以在类内部访问 private 变量}
}
访问修饰符的总结
访问修饰符 | 类内部 | 同一包内 | 不同包的子类 | 不同包的非子类 |
---|---|---|---|---|
public | ✔️ | ✔️ | ✔️ | ✔️ |
protected | ✔️ | ✔️ | ✔️ | ❌ |
default | ✔️ | ✔️ | ❌ | ❌ |
private | ✔️ | ❌ | ❌ | ❌ |
访问修饰符的使用场景
public:
用于暴露 API,如工具类的方法或常量。例如:public static final int MAX_VALUE = 100;
protected:
用于允许子类扩展父类的功能。例如:protected void init() { … }
default:
用于包内共享的辅助类或工具方法。例如:void helperMethod() { … }
private:
用于封装类的内部实现细节。例如:private String secretKey;
注意事项
- 类的访问修饰符只能是 public 或 default(包私有)。
- 接口中的方法默认是 public,变量默认是 public static final。
- 构造器可以使用 public、protected、default 或 private。
- private 构造器常用于单例模式或工具类。
package com.example;public class AccessExample {public int publicVar = 1;protected int protectedVar = 2;int defaultVar = 3; // default 访问权限private int privateVar = 4;public void publicMethod() {System.out.println("Public Method");}protected void protectedMethod() {System.out.println("Protected Method");}void defaultMethod() {System.out.println("Default Method");}private void privateMethod() {System.out.println("Private Method");}
}class AnotherClass {void testAccess() {AccessExample example = new AccessExample();System.out.println(example.publicVar); // 可以访问System.out.println(example.protectedVar); // 可以访问System.out.println(example.defaultVar); // 可以访问// System.out.println(example.privateVar); // 编译错误,无法访问 private 变量}
}