本帖最后由 jeffreyno1 于 2012-7-15 22:50 编辑
自己总结的对Java访问控制的理解。
Java中的每个特性背后都是为了解决某个特定的问题,“访问控制”也不例外。
Bruce Eckel在《Thinking in Java》中提到”访问控制“与“最初的实现并不恰当”有关。最初的实现为什么不恰当?这有点像我们写作文,第一遍写完之后回过头看,总是会发现有需要修改的地方。开始的设计侧重在解决问题本身,对于可能会出现的问题考虑得可能不够周全。
既然最初的实现不恰当,那就改呗。可是问题来了,你要修改的部分极有可能已经被别人调用了,而调用你代码的人极有可能希望你保持不变。如何解决这个冲突,就是“访问控制”要解决的问题。
回到问题上来,如何从一开始就避免这种冲突的发生呢?如果让我们来解决它,我们会怎么想?我会在设计代码的时候就确定好哪些可以被访问,哪些不可以被访问。可以被访问的部分保持不变,至少其提供的被调用的功能保持不变;不能被访问的部分,如果需要改变,其改变至少也不能够改变系统的现有功能。
我们再看看Java是如何处理冲突的。它引入了访问权限修饰符,将访问权限进行分级,权限从大到小依次是:public, protected, 包访问权限(package-private,无关键字)和private。要理解这些修饰符的意义,首先要了解两个概念包和子类。包是java程序的组织方式,java是以包的形式来组织类库的,相关的类放在同一个包下,多个包构成了整个项目。子类,就是继承自父类的类。
另外需要补充的是“访问”一词的理解。有“访问”那就一定有“访问者”和“被访问者”。在这里,访问者是类或对象,被访问者是类中的域和方法。
一个类所访问的范围从小到大依次是:类内部,同一个包内的其它类,不同的包下的子类,不同的包下的非子类(任意类)。这个范围正好对应了java所提供的四个访问修饰符。
- private:只有当前类对其修饰的成员有访问权限
- 包访问权限:当前包中的所有其它类对其所修饰的成员都有访问权限
- protected:其涵盖了包访问权限,当前包中的所有其它类以及不同包中的子类对其修饰的成员有访问权限
- public:任意类对其所修饰的成员都有访问权限
我们再回到文章开始提到的变动和不变的冲突上来,我们在设计代码的时候尽可能将一切方法都定为private的,仅将你愿意开放给别人的方法定为public的。我们的改动只针对private的成员,这样也就避免了冲突。至于包访问权限,它允许将包内所有相关的类组合起来,以使它们彼此之间可以相互访问。projected所处理的是继承关系中不同包中的子类访问父类方法的途径,同时这个方法又不能允许不同包的其它类访问。
|
|