这篇博客主要用来介绍Java中的访问权限.
引入访问控制权限
我们都知道,一个通用类库(如:JDK)开发出来的目的是让普通开发者重用以节省开发时间与精力,但是类库的设计不可能在刚开始就尽善尽美,普通开发者在对类库的使用过程中,总能发现很多由于设计不当所出现的问题,这时,类库开发者就需要对类库进行重构。
而类库的更新不能影响到消费者程序的执行,这就引出了面向对象设计的一个基本问题:类库开发者如何区分可以变动的部分和不可以变动的部分?
Java这门语言在设计的时候吸收了很多前人的经验,所以这个问题也被抛了出来,而它解决这个问题的方法是通过访问修饰符,即限制普通开发者访问的部分。
对于访问权限成型的一些思考
在设计时很容易想到使用二分,即将访问权限分为可以访问与不能访问两种,也就是引入public与private。如果域被public修饰,说明这个部分可以被任何人访问到;如果域被private修饰,则除了当前类其他人都不能访问。但这样又会出现一些问题,即使用绝对的二分产生的副作用太大,被private修饰的域连类库开发者本身都无法访问了。
Java在引入包进行命名空间的管理之后,就有了一种较为优秀的解决方法,即引入friendly与protected,对于具有friendly访问权限的域,只有同一个包内的类可以访问;对于具有protected访问权限的域,只有此域所在类的子类或与此类在同一个包内的类可以访问,这样就划分了较为清楚的界限。
一般来说,用户自己写的类会被划分到自己特有的包中,这种情况下,这种访问权限控制的方式对于类库开发者与用户来说是正确的。但是,并不是所有的用户都会遵守规则,如果用户恶意使用类库开发者使用的包,还是会产生权限泄露,即用户访问到了类库开发者隐藏的东西。对于这种情况有什么解决方法么?
个人认为:这个问题根本不是问题….因为权限控制实际上是一种约定,这种约定的内涵是:在使用双方都遵守的情况下,双方都可以得到较满意的答案(即:类库开发者拥有重构的 对于类库开发者来说唯一的约束是那些自己公开的API。也就是说对于已经公开的API,也许会有用户使用,这种情况下一定不能更改API以避免影响用户已经开发过的Java应用程序(保证向下兼容),那么对于类库开发者认为用户一定无法访问的部分就可以随便改了,在用户自己违反了约定的情况下,他的权益就无法也无需得到保证。
Java访问权限关键字介绍
上面说到Java中分了四种访问权限,一表胜千言,下面是详细的介绍。关键字含义类内部本包子类外部包public公有的√√√√
protected受保护的√√√×
default缺省(包访问权限)√√××
private私有的√×××
一些需要注意的小问题Java的权限控制只停留在编译期间。它不会在编译生成的class文件中留下任何的痕迹,只在编译的时候进行访问控制的检查。因此,通过反射可以访问任何包下任何类中的成员,包括私有成员。
类的访问修饰符。对于一个非内部类来说,因为它直属于包而不属于任何一个类,所以只有包访问权限与公有权限对它来说才有意义。
也就是说,只能用public或者默认权限来修饰非内部类。
对于一个内部类来说,它直属于一个类,因此四种权限都可以对其起作用。