修饰符范围
一张图概括修饰符范围
修饰符 | 范围 |
---|---|
public | 公开,所有包均可访问 |
protected | 包私有,包内所有类可访问 |
default(不写) | 包私有,包内所有类可访问,但不可继承 |
private | 类私有,仅当前类可使用 |
以下几种情况需要考虑:
1. 约定俗成
- 构造方法默认是public: 如果你没有显式地指定构造方法的修饰符,则默认构造方法的修饰符是
public
,这样外部类可以实例化你的类。 - 构造方法应该有明确的访问权限: 显示定义构造方法时,应明确访问权限是
public
或private
。通常情况下,构造方法应该与类的访问权限一致,以便类的实例化过程受到相同的限制。 - 尽量减少使用protected和default修饰符: 尽管
protected
和default
修饰符有其用处,但应尽量减少使用,以保持代码的清晰性和易读性。 - 常量使用final修饰: 常量应该使用
final
修饰符来表示其值不能被修改,通常与static
一起使用以便在整个类中共享。 - 成员变量一般使用private修饰: 成员变量应该尽可能地使用
private
修饰符来限制对其访问,以避免直接访问和意外修改,从而提高封装性和安全性。 - 方法应该使用最小访问权限原则: 方法默认的修饰符是包级私有,方法的访问权限应该根据需求来确定,一般情况下,方法应该使用最小访问权限原则,即只暴露给外部需要访问的部分。
- 接口中的方法一般使用public修饰: 在接口中定义的方法,默认是
public
修饰的,因为接口中的方法必须是公共的,以便实现类可以实现这些方法。
2. 类、成员变量、方法修饰符范围的优先级
类 > 成员变量 = 方法,即方法和成员变量的范围受到类的访问权限限制。举例如下:
private class MyClass {
public MyClass() {
// 构造方法
}
}
public class AnotherClass {
public void createMyClassInstance() {
// 下面这行代码会报错,因为无法在AnotherClass中实例化MyClass
MyClass obj = new MyClass();
}
}
在上面的例子中,即使 MyClass
的构造方法是 public
,但由于 MyClass
的修饰符是 private
,外部的 AnotherClass
仍然无法直接实例化 MyClass
。
3. 静态变量和静态方法受类的访问权限限制吗?
当我们使用 static 修饰成员变量或方法时,该变量或方法会被所有的对象实例共享,它存储在方法区(Java 8 及之前的版本中称为永久代,Java 8 开始称为元空间)。但是,静态变量/方法仍属于类,受类的访问权限限制,比如如果类的访问权限是 protected 或默认(包私有),那么该类中的静态方法在同一个包内的其他类中是可以被调用的,但是在包外部的类中是无法直接调用的。