您的位置:首页 > 编程语言 > Java开发

第6章 访问权限控制

2015-12-01 02:15 260 查看
引言:访问权限(或隐藏具体实现)与“最初的实现并不恰当”有关。

先了解两个概念:

封装(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();
}
} ///:~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java Thinking in Java