JavaSE基础知识(十六)--Java的访问权限控制概述

Java SE 是什么,包括哪些内容(十六)?

本文内容参考自Java8标准

如果你有缘点开此博文,请至少看到后面的知识点分类列表!你就能知道Java的访问权限控制到底包括了哪些内容。

个人认为编程语言中之所以需要访问权限控制是因为类的创建者不可能一次性就写出最完美的代码,一旦客户端程序员使用了类创建者提供的代码,但是在后期,类创建者又发现了更好的实现,他必定需要对类代码进行修改,那么,需要满足两个限制条件:
1、类创建者对类代码的任何修改不能对客户端程序员的代码产生任何影响!
2、客户端程序员的代码不需要做任何修改就能享受到这些修改带来的好处!

所以,一句话总结就是:类创建者需要将客户端程序员不能使用的部分进行隐藏,而仅仅暴露允许他们使用的部分。
以下内容摘自Java编程思想第四版
访问权限控制(或隐藏具体实现)与"最初的实现并不恰当"有关!
所有优秀的作者,包括那些编写软件的程序员,都清楚他们一开始写的代码,必须要经过不断的思考以及修改,才会变得完美,比如你在实现了一个功能以后,过几天,再回过头来审视这段代码,有可能你会找到更好的方式去实现相同的功能,这正是重构的原动力之一,重构即重写代码,使得它更易读,更易理解,并因此而更具有可维护性(最明显的一点是:在最开始的时候,你的代码中可能会有大量的变量声明,可是过一段时间以后,你会发现其中很大一部分是不需要的。因为并不是每次你需要变量的时候都需要去重新声明一个,其实你可以看看之前已经声明了的变量是否已经结束了它的上一个使用范围。如果是,你可以接着让它进入下一个范围,所以,这种变量的连续使用可能会导致你"看不懂"别人的代码)。
但是,在这种修改和完善代码的愿望之下, 也存在着巨大的压力,通常总是会有一些消费者(客户端程序员)需要你的代码在某一些方面保持不变,因此你想改变代码,而他们却想让代码保持不变,由此而产生了在面向对象设计中需要考虑的一个基本问题:如何把变动的事物和不变的事物区分开来。
这对类库而言尤为重要,该类库的消费者所需要实现的功能必须依赖它所使用的那部分类库,并且,如果类库有了新的版本,他们并不需要改写代码,但是从另一个方面来说,类库的开发者必须有权限进行修改和改进,并确保客户端代码并不会因为这些改动而受到影响。
这些目标可以用过约定来达到,例如:类库开发者必须同意在修改类库中的任何现有类时不能删除任何现有的方法,因为那样肯定会破坏客户端程序员现有的代码,但是,还有一种情况更加棘手,在有域(类数据成员,也叫类变量)数据存在的情况下,类开发者要怎样才能知道究竟都有哪些域已经被客户端程序员调用了呢?这对于某些方法仅属于类的实现的一部分,因此并不想被客户端程序员直接使用的情况来说同样如此,如果类库的开发者想要移除旧的实现而添加新的实现时,又怎么处理呢?改动任何一个实现都有可能影响客户端程序员的代码,于是类库的开发者会束手束脚,无法对事物进行任何改动。
为了形象生动地说明问题,通过代码举例:
为了更好地说明问题,我暂时不用任何的权限修饰关键字
⑴、数据域、方法:

// 有数据域的代码举例
   //假设这个类是类库中的一个工具类。
   //类库工具类Test
   public class Test {
   
      //String类型的类变量s
	  String s;
	  //int类型的类变量i
	  int i;
	
	  //方法start()
	  void start() {
   }
	  //方法begin()
	  void begin() {
   }
}

实际代码示例:实际代码示例!
客户端程序员的类:
需要使用类库的类实现某些功能。
使用类库中的类实现某些功能!
客户端程序员使用完毕:
客户端程序员使用完毕!
如果这个时候对类库中的类进行升级和修改:做了如下的改动:
改了一个方法的名称;
改了一个类变量的名称;
对类库中的类进行了修改!
这个时候再来看下客户端程序员的代码发生了什么?
编译器报错了!
所以,如果没有进行控制,类库中的类一变动,立即就会对客户端程序员的代码产生不小的影响,最严重的可以导致代码无法启动运行!
其他的例子可以自行进行尝试,下面来重点讨论如何进行控制,如何避免上述情况的出现。
为了解决这一问题,Java提供了访问权限修饰词,以供类库开发程序员向客户端程序员指明哪些是可用的,哪些是不可用的(实际上这个不明显,因为你能看到的都是可用的,不可用的你根本看不到,除非你有兴趣看源码),访问权限控制的等级,从最大权限到最小权限依次为:publicprotected包访问权限(就是我上面代码示例中使用的权限,没有任何权限关键字修饰的就默认是包访问权限)和private------仅向客户端程序员公开你愿意让他们使用的方法和域,这样做是完全正确的。尽管对于那些使用其他的语言(尤其是C语言)编写程序并在访问事物的时候不受任何限制的人而言,这与他们的直觉相违背,但是,他们迟早还是会信服Java权限控制的价值。
可能你们已经注意到了,也是我为什么选择了这种权限作为示例代码的原因:包访问权限。从它这里又引出了一个"包"的概念
前面我们只讨论了与类有关的概念,但是,类一旦多了的话,怎么管理呢?或者换一个角度来看问题:会不会有一些类,有必要把它们放在一起,因为它们之间会相互依赖呢?

答案是:会的!

因此,我们会将一些依赖关系非常明显的类放在一起,也就是放在所谓的"包"中,同时,你需要给这个包取一个在世界上独一无二的名字。

你需要非常重视这个:在世界上独一无二的名字!如果接触过这块的就知道,因为域名在世界上就是独一无二的,所以Java中的包名通常就是域名或者是域名的倒序(如果你准备将你的程序发布供其他客户端程序员使用,最好是你自己的私人域名)。

那么,从这里需要引出一个很重要的编程思路:如果你身处

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值