1)访问控制(或隐藏具体实现)与“最初的实现并不恰当”有关。
2)访问权限空值的等级,从最大权限到最小权限依次为:public、protected、包访问权限(没有关键词)和private。
6.1 包:库单元
1)包内包含有一组类,它们在单一的名字空间之下被组织在了一起。
2)当不指定类所属的包时,被称为未命名包或默认包。
3)每个.Java文件可以有一个public类,该类的名称必须与文件的名称相同(包括大小写,但不包括文件的后缀名.java)。每个.Java文件只能有一个public类,否则编译器不会接受。
6.1.1 代码组织
1)如果使用package语句,它必须是文件中除注释之外的第一句程序代码,在文件的起始处写:package access; 就表示你在声明该编译单元是名为access的类库的一部分。
2)Java包的命名规则全部使用小写字母,包括中间的字也是如此。
6.1.2 创建独一无二的包名
1)包名称一般选用域名的单词反序,并且全部小写。
2)包名称中包含的 '.' 应该对应与文件结构的层次。
6.1.3 定制工具库
1)当我们需要使用一个不同包中的类时,可以使用import语句来导入。
6.1.4 用import改变行为
1)Java没有C的条件编译功能,该功能可以使你不必更改任何程序代码,就能够切换开关并产生不同的行为。
2)Java可以通过不同包名的形式来实现条件编译,例如调试过程中,可以通过修改被导入的package的方法来实现这一目的。
6.1.5 对使用包的忠告
1)务必记住,无论何时创建报,都已经在给定包的名称的时候隐含的制订了目录结构,这个包必须位于其名称所制定的目录之中,而且该目录必须是在以CLASSPATH开始的目录中可以查询到的。
注:使用开发工具(Eclipse或者其他开发工具)进行创建类的过程中,开发工具已经帮我们实现了创建目录的过程。
6.2 Java访问权限修饰词
1)public、private和protected这几个Java访问权限修饰词在使用时,是置于类中每个成员的定义之前的——无论它是一个域还是一个方法。
6.2.1 包访问权限
1)默认访问权限没有任何关键字,但是通常是指包访问权限(有时也表示为friendly)。这就意味着当前包中的所有其他类对那个成员都有访问权限,但对于这个类之外的所有类,这个成员是private的。
2)提供访问器(accessor)和变异器(mutator)方法(也成为 get/ set 方法),可以读取和改变数值。
6.2.2 public:接口访问权限
1)使用关键字public,就意味着public之后紧跟着的成员声明自己对每个人都是可用的。
6.2.3 private:你无法访问
1)关键词private的意思是,除了包含该成员的类之外,其他任何类都无法访问这个成员。
6.2.4 protected:继承访问权限
1)protected的作用是,有某个特定成员,把对他的访问权限赋予派生类而不是所有类。
2)protected也提供包访问权限,也就是说,想通报内的其他类可以访问protected元素。
6.3 接口和实现
1)访问权限的控制常被称为是具体实现的隐藏,把数据和方法包装进类中,以及具体实现的隐藏,常共同被称作是封装。
6.4 类的访问权限
1)每个编译单元(文件)都只能有一个public类。
注:可以同时拥有多个 public 修饰的非静态内部类(或静态内部类)。
//一个文件中只能含有一个public修饰的外部类
//可以同时拥有多个public修饰的内部静态类
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
dog.woof();
//创建非静态内部类的对象
Main main = new Main();
Main.Cat cat = main.new Cat();
cat.woof();
}
//public 修饰的静态内部类
public static class Dog{
public void woof(){
System.out.println("W W W W W");
}
}
//public 修饰的非静态内部类
public class Cat{
public void woof(){
System.out.println("M M M N");
}
}
}
2)public类的名称必须完全与含有该编译单元的文件名相匹配,包括大小写。
3)虽然不是很常用,但编译单元内完全不带public类也是有可能的,在这种情况下,可以随意的对文件命名(不推荐这样做,因为不利于阅读和维护代码)。
4)请注意,类既不可以是private的(这样会使得除了该类之外,其他任何类都不可以访问它),也不可一世protected的(内部类可以是这两种情况)。所以对于类的访问权限,仅有两个选择:包访问权限或者public。
5)如果不希望其他任何人对该类拥有访问权限,可以把所有的构造器都指定为private,从而阻止任何人创建该类的对象,但是有一个例外,就是你在该类的static成员内部可以创建。
注:单例模式就是用了这样的方式实现的。
6.5 总结
1)本章讨论了类是如何被构建成类库的:首先,介绍了一组类是如何被打包到一个类库中的,其次,类是如何控制对其成员的访问的。
2)控制对成员的访问权限有两个原因,第一是为了使用户不要碰触到那些他们不该碰触的部分。第二是为了让类库设计者可以更改类的内部工作方式,而不必担心这样会对客户端程序员产生重大的影响。
3)访问修饰符对应的权限表。
修饰符 | 当前类 | 同 包 | 子 类 | 其他包 |
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
无 | √ | √ | × | × |
private | √ | × | × | × |