访问权限控制
访问控制(或隐藏具体实现)与“在最初的实现并不恰当”有关。
- 如果你把一个代码段放到了某个位置,等过一会儿回头再看时,有可能会发现有更好的方式去实现相同的功能。这正是重构的源动力之一,重构即重写代码,以使得它更可读、更易理解、并因此而更具可维护性。
- 面向对象设计中需要考虑的一个基本问题:“如何把变动的事物与保持不变的事物区分开来。
- Java提供了访问权限修饰词,以供类库开发人员向客户端程序员知名哪些是可用的,哪些是不可用的。访问权限控制的等级,从最大权限到最小权限依次为:
public
、protected
、包访问权限
(没有关键词)、private
。
6.1 包: 库单元
- 当编写一个Java源代码文件时,此文件通常被称为
编译单元
。每个编译单元都必须有一个后缀名 .java,而且在编译单元内则可以有一个public类,该类的名称必须与文件的名称相同。每个编译单元只能有一个public类,否则编译器就不会接受。如果在该编译单元之中还有额外的类的话,那么在包之外的世界是无法看见这些类的,这是因为它们不是public类,4而且它们主要用来为主public类提供支持。
6.2 Java访问权限修饰符
控制访问组件的可见度
修饰符 | 本类 | 同包 | 其他包子类 | 其他 |
---|---|---|---|---|
private | ❤ | |||
(default) | ❤ | ❤ | ||
protected | ❤ | ❤ | ❤ | |
public | ❤ | ❤ | ❤ | ❤ |
6.3 接口和实现
访问权限的控制常被称为是具体实现的隐藏。把数据和方法包装进类中,以及具体实现的隐藏,常共同被称作是封装。
访问权限控制将权限的边界划在了数据类型的内部的两个重要原因:
- 第一个原因是要设定客户端程序员可以使用和不可以使用的界限。
- 第二个原因:将接口和具体实现进行分离。
6.4 类的访问权限
- 每个编译单元(文件)都只能有一个public类。
- public类的名称必须完全与含有该编译单元的文件名相匹配,包括大小写。
- 虽然不是很常用,但编译单元内完全不带public类也是可能的。
- 类既不可以是private的也不可以是protected的
- 一个内部类可以使private或是protected的,但那是一个特例。