Java 类成员的访问控制符

今天被问了一个 Java 基础知识:Java 类成员的访问控制符(Access Modifier)有几种?这些访问控制符之间有何区别?

 

首先回答第一个问题。通常我们可以显示声明的访问控制符有三个:public, private 和 protected。但是,我们也会碰到另一种情况:在成员变量或者方法声明前面不加任何的访问控制符。通过这种方式声明的成员具有缺省访问控制(default access)属性。具有缺省访问属性的类成员的可访问性被限制在包(package)内,因而有人也称之为包可见访问控制。

 

然后,关于四种访问控制属性的对比,可以直接引用 SO 上的一张非常清晰的对比图表:

Modifier    | Class | Package | Subclass | World
————————————+———————+—————————+——————————+———————
public      |  ✔    |    ✔    |    ✔     |   ✔
————————————+———————+—————————+——————————+———————
protected   |  ✔    |    ✔    |    ✔     |   ✘
————————————+———————+—————————+——————————+———————
no modifier |  ✔    |    ✔    |    ✘     |   ✘
————————————+———————+—————————+——————————+———————
private     |  ✔    |    ✘    |    ✘     |   ✘

 

这张图表可以这样解读(以 protected 为例):

proctected 访问控制符所修饰的类成员在声明该成员的类类所在的包中的所有其他类以及该类的所有子类中是可见的,而对除此之外的其他类是不可见的。

 

需要注意的一点是,缺省访问控制的类成员只是包内可见,如果其子类也同一个包内,那么也是子类可见的。但是,由于对包外声明的子类是不可见的,所以有上图标中的第4行第4列的✘。

 

另外,值得领会的另一个问题是:在实际编程中应该如何选择使用哪一种访问控制符?SO上得票数第二的回答也是值得读一下的。总的来说,访问控制符设计的初衷是针对 OO 中的封装性 - 应该尽量将信息隐藏。类成员的访问权限放的越开,日后对于该类成员的任何改变就越要谨慎,因为这个类成员可能被很多人使用。如何选择,应该充分考虑类成员的最终用途。

 

你可能感兴趣的:(java,language)