引言:访问权限(或隐藏具体实现)与“最初的实现并不恰当”有关。
先了解两个概念:
封装(encapsulation),即隐藏对象的属性和实现细节,仅对外公开接口。
重构(Refactoring),就是通过调整程序代码改善软件的质量、性能,使其程序的设计模式和架构更趋合理,提高软件的扩展性和维护性。
程序员分为两类,类库的消费者和类库的开发者,类库的消费者希望类库出现新版本的时候,他们并不需要改写他们的代码,而类库的开发者则必须有权限对类库进行修改和改进,而不影响客户端程序员。
这就要求我们将“变动的事物”与“保持不变的事物”区分开来。
这正是访问权限的作用所在。
1. 包:库单元
包提供了一个管理命名空间的机制。目的是将所有类成员的名称彼此隔离。
包名的命名规范参见前面的文章http://blog.csdn.net/qq_18738333/article/details/49828349
编译单元是一个带后缀名.Java的文件,编译单元内只能有一个public类,且该类的名称必须与文件名相同。编译一个.java文件,其中的每个类都会生成一个后缀名为.class的文件。
Java可运行程序是一组可以打包并压缩为一个Java文档文件(JAR,使用Java的jar生成器)的.class文件。Java解释器负责对这些文件的寻找、装载和解释。
类库是一组类文件,每个文件都有一个public类,以及任意数量的非public文件,用关键字package组合到一起。
package语句必须作为文件的第一个非注释语句出现,表明该编译单元是某个类库的一部分,但使用一个类库时,必须用import语句导入。
需要记住:package和import语句关键字允许你做的,是将单一的全局名字空间分割开,使得无论多少人在使用Internet和Java编写类,都不会出现名称冲突的问题。
2. Java访问权限修饰词
1. 包访问权限
2. public:接口访问权限
3. protect:继承访问权限
4. private:私有
获得访问权限的方法有这些:
(1) 使成员成为“public”(公共的)。这样所有人从任何地方都可以访问它。
(2) 舍弃所有访问指示符,并将其类置于相同的包内。这样一来,包内的其他类就可以访问成员。
(3) 继承的类既可以访问一个protected成员,也可以访问一个public成员(但不可访问private成员)。
(4) 提供“访问器(accessor)/变异器(mutator)”方法(亦称为“获取(get)/设置(set)”方法),以便读取和修改值。这是OOP环境中最优雅的一种方法。
不多累赘,只记录需要注意的用法:
1. 默认包为包内的文件提供了包访问权限
2. 类的访问权限只有包访问权限和public两种选择。
3. 如果想控制如何创建对象,并阻止别人访问某个特定的构造器(或者全部构造器),可以使用private修饰构造器,用一个static方法控制创建对象。这就是单例模式(singleton)。这是很常见的设计模式,比如游戏引擎中的导演类。
看下面这段代码
//: Lunch.java // Demonstrates class access specifiers. // Make a class effectively private // with private constructors: class Soup { private Soup() {} // (1) Allow creation via static method: public static Soup makeSoup() { return new Soup(); } // (2) Create a static object and // return a reference upon request. // (The "Singleton" pattern): private static Soup ps1 = new Soup(); public static Soup access() { return ps1; } public void f() {} } class Sandwich { // Uses Lunch void f() { new Lunch(); } } // Only one public class allowed per file: public class Lunch { void test() { // Can't do this! Private constructor: //! Soup priv1 = new Soup(); Soup priv2 = Soup.makeSoup(); Sandwich f1 = new Sandwich(); Soup.access().f(); } } ///:~