今天被问了一个 Java 基础知识:Java 类成员的访问控制符(Access Modifier)有几种?这些访问控制符之间有何区别?
?
首先回答第一个问题。通常我们可以显示声明的访问控制符有三个:public, private 和 protected。但是,我们也会碰到另一种情况:在成员变量或者方法声明前面不加任何的访问控制符。通过这种方式声明的成员具有缺省访问控制(default access)属性。具有缺省访问属性的类成员的可访问性被限制在包(package)内,因而有人也称之为包可见访问控制。
?
然后,关于四种访问控制属性的对比,可以直接引用 SO 上的一张非常清晰的对比图表:
class="java" name="code">Modifier | Class | Package | Subclass | World ————————————+———————+—————————+——————————+——————— public | ? | ? | ? | ? ————————————+———————+—————————+——————————+——————— protected | ? | ? | ? | ? ————————————+———————+—————————+——————————+——————— no modifier | ? | ? | ? | ? ————————————+———————+—————————+——————————+——————— private | ? | ? | ? | ?
?
这张图表可以这样解读(以 protected 为例):
proctected 访问控制符所修饰的类成员在声明该成员的类、类所在的包中的所有其他类以及该类的所有子类中是可见的,而对除此之外的其他类是不可见的。
?
需要注意的一点是,缺省访问控制的类成员只是包内可见,如果其子类也同一个包内,那么也是子类可见的。但是,由于对包外声明的子类是不可见的,所以有上图标中的第4行第4列的?。
?
monospace;">另外,值得领会的另一个问题是:在实际编程中应该如何选择使用哪一种访问控制符?SO上得票数第二的回答也是值得读一下的。总的来说,访问控制符设计的初衷是针对 OO 中的封装性 - 应该尽量将信息隐藏。类成员的访问权限放的越开,日后对于该类成员的任何改变就越要谨慎,因为这个类成员可能被很多人使用。如何选择,应该充分考虑类成员的最终用途。
?