【java天梯-3】访问权限控制

现实生活中的每一个人都是双面的,既有暴露给外界的容貌,又有隐藏在内心深处的想法。虽说有些性情中人愿意与他人敞开心扉,但也不至于把自己变的完全透明,总有一些比人看不到的本质。在代码的世界里也一样,比如我们的Java。

Java自问世以来,就被冠以“安全可靠”这个头衔,这个安全分好几个方面,首先很少听说有人用Java写木马?因为即便Java拥有一处编译随处运行的跨平台特性,但也是依赖于各个平台上的Java虚拟机。其次,在Java开发本身,类库开发者和客户端程序员之间,针对类库的某些类和成员,Java也提供了安全机制来保证类库的底层实现不被客户端成员误操作所破坏。

在Java中,每一个类文件都隶属于一个包当中,有些同学可能会说“没有! 我都直接在src目录下直接建的”,麻烦这些同学回去好好巩固一下基础,在src下直接新建类放在了默认包下,即未命名包。

包内包含了一组类,他们在单一的名字空间之下被组织在了一起,对于一个类库下相同类文件的Java类,Java采用全限定类名(即:包名+类名)的形式唯一标识一个类。换句话说,一个类库里有好多个大哥,他们就是包,什么青龙包,山口包,灌汤包,狗不理包啥的。每个大哥手底下都有一群小弟,紧紧围绕在大哥身边。那么这些小弟如果有重名的,比如青龙包下面有个叫刘老四类小弟,恰巧山口包下面也有一个叫刘老四的小弟。恰巧有一天我们最牛逼的上帝JVM编译器在点名刘老四的时候,呀呵,咋出来俩刘老四?上帝就觉得不爽了,咋点刘老四出来俩?是不是有代答到的?(笑而不语~) 这时候上帝JVM就开了个会,研究了一下各个老大手底下小弟取名的问题,会议最终达成了协定,每个小弟都以大哥之名冠以小弟之前缀。也就是说 青龙包下的刘老四的小名叫刘老四,大名叫“青龙包.刘老四”,即全限定类名。

由此可以看出,每一个Java类在类库中都有着唯一的全限定类名,就不会出出现一枪俩鸟,仨鸟的事儿了

针对全限定类名,例如类:java.util.Date ,我们可以使用 java.util.Date date = new java.util.Date() 来构造一个对象,但是这样很不爽啊,前缀那么长,虽然说java.util这个包是Date这个小弟的老大,但不管当前Java文件中是否存在同名小弟都要把大哥的名带上,属实有点啰嗦。这时候这帮开发者又找JVM开了个会,说:“我们能不能在一个Java文件里只声明有哪些大哥的小弟在,即先标记好这个小弟的大哥是谁,之后每次使用的时候直接用小名就可以了”,此次会议开的特别成功,经相关部门起草、领导层层审批,最终决定使用import关键字在类文件的头部一次性导入某包内一个或一组类文件,这样即便有同名,那么直接使用全限定类名就好了,那也很省事儿。

为了避免包名的冲突,Java的设计者推荐开发者在创建包的时候使用开发者域名的逆序名称作为该开发者的包名,因为域名在互联网上肯定是唯一的,所以包名也是唯一的。

访问修饰符

访问修饰符主要是针对类、类成员属性和类成员方法。访问修饰符总公共包含以下几个

  • public:接口访问权限。用来修饰类、成员和方法,可以任何类访问
  • protected:继承访问权限。用来修饰成员和方法,可以被自己或者同一个包下或其子类访问
  • private:私有访问权限,用来修饰成员和方法,只能被类本身访问
  • 默认访问修饰符:即不写访问修饰符,用来修饰类、成员和方法,只能被自身和同一包下的类访问
访问级别 访问控制修饰符 同类 同包不同类(不含子类) 同包子类 不同包不同类(不含子类) 不同包子类
公开 public
受保护 protected
默认
私有 private

总结

通过对Java访问权限的学习,让我加深了对封装的理解。建议在日常开发时,类的属性全部私有,暴露出公开的属性访问器方法。尽量避免过多的暴露类的实现细节给外部,将内部某些关键的方法实现使用private访问控制修饰符限制起来,这样如果该方法日后需要重构,可以不用考虑会有其他客户端程序员依赖该方法,可以随意改动而不影响使用。

参考

  • 《Java编程思想》