第6章 访问权限控制
在面向对象设计中需要考虑一个基本问题:“如何把变动的事物与保持不变的事物区分开”这对类库(library)而言尤为重要。java提供了访问权限修饰词,访问权限控制的等级,从最大权限到最小权限依次为:public、protected、包访问权限(没有关键词,默认)和private。
Java用关键词package将构件捆绑到一个内聚的类库单元中,package与访问权限修饰词共同控制类的使用范围。package语句,必须是文件中除注释外的第一句,需要在文件的起始位置书写。如果需要引用别的包里的代码,需要使用import关键字。请注意,Java包的命名规则全部使用小写字母,包括中间的字也是如此,一般为域名倒写,在此基础上加上项目名和容易理解的包名。package和import关键字允许我们做的,是将单一的全局名字空间分割开,使得无论多少人使用Internet以及Java开始编写类,都不会出现命名冲突的问题。
如果不使用访问权限控制关键字,就是默认的包访问权限,在一个包(package)里的成员可以相互调用。包访问权限必须在同一个包里,即package后面的文件名相同,必须是同一个目录(当然也是同一级,父文件夹并不能调用子文件夹的包访问权限成员)。当你想使用别的包的成员,需要使用使用import导入包,且该成员的修饰符必须是public。public,接口访问权限。使用关键字public,就意味着public修饰的成员,无轮是谁,无论在哪里都可以访问。private,私有访问权限,除了包含该成员的类以外,其他任何类都不可以访问这个成员。protected,继承访问权限,也提供包访问权限(public>protected>包访问权限)。需要注意的是:protected修饰的成员,只有在一个包内,其子类才可以访问(不在一个包内只有pubic修饰的才可以访问)。
访问权限的控制常被称为具体实现的隐藏。把数据和方法包装进类里,以及具体实现的隐藏,常共同被称为封装。其结果是一个同时带有特征和行为的数据类型。访问权限控制将权限的边界划在了数据类型的内部,接口和具体实现相分离。
类的访问权限。在Java中,访问权限修饰词也可以用于确定库中的哪些类对于该库的使用者是可用的。public关键字修饰的类,可以为所有访问者使用。需要注意的是,每个编译单元(文件)只能有一个public类,且类名与文件名相同,包括大小写。另一点需要注意的是,类的访问权限仅有2个选择:包访问权限或public。如果不希望其他任何人对该类有访问权限,可以把所有的构造器都指定为private,从而阻止任何人创建该类的对象。但是有一种例外方法可以创建该类的对象,在该类的static成员内部创建对象,可以使用类名直接调用该static方法得到对象,这种特定的模式,称为单例(singleton)。