Java中的访问修饰符有哪些
在 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 变量
}
}