论Java访问权限控制的重要性
人在什么面前最容易失去抵抗力?
美色,算是一个,比如说西施的贡献薄就是忍辱负重、以身报国、助越灭吴;金钱,算是另外一个,我们古人常说“钱乃身外之物,生不带来死不带去”,但我们又都知道“有钱能使鬼推磨”。
除去美色和金钱,我认为还有一个,就是读者的认可——“二哥,你的文章真的很棒,我特别喜欢。希望能多多更新Java基础知识,真的是受益良多,就好像是在读王小波的散文,但又学了编程!”——你说,收到读者这样暖暖的评语,还需要美色和金钱?“两者皆可抛”嘛。
这篇文章主要介绍一下Java的访问权限控制。
01 访问权限控制的重要性
舒淇曾说过这样一句令人感到震撼后又虎躯一震的话:“我要把我曾经脱下的衣服一件一件的穿回来!”如今,她做到了——通过自己的努力,不仅得到了观众的认可,得了很多大奖,还收获了幸福。尽管,真的是尽管,还有一些“忆往昔峥嵘岁月稠”的朋友在电脑硬盘的深处留存了一些舒淇早年的珍藏版照片。
我扯这个例子主要为了证明一句话——访问控制(或隐藏具体实现)与“最初的实现并不恰当”有关——如果舒淇当初那些照片的权限不是那么公开化的话,那现在就可以私自烧毁了;或者换一种出道方式;然而没有如果了。
在你最初的编程生涯中,不知道你是否创作过下面这样“优秀”的代码,就像程序清单1-1那样。
程序清单1-1:
public class NiubiUtil { public static Date getNextDay() { long millis = 24 * 60 * 60 * 1000; try { Thread.sleep(millis); } catch (InterruptedException e) { e.printStackTrace(); } return new Date(System.currentTimeMillis()); }}
本来你这些代码只是自己写着玩呢,谁知道被一个叫小二哥的同事不经考量地调用了。这一调用不要紧,小二哥的代码真的活活地等了一整天——产品经理小王老师某一天心血来潮非要测试小二哥的代码,然后点了查看下一天的按钮,程序真的在那静静地等着,直到下一天真的来临。
后果是,小王老师为了安抚用户们躁动的情绪把小二哥直接拉出去祭天了;你躲在角落里瑟瑟发抖,心里默默念叨了句话——“小二哥,你走好,兄弟真的对不住了”。
一场血淋漓的惨案啊!只因为Java访问权限控制的使用不当——该private的方法,结果失误写成了public——论访问权限控制的重要性。
02 为什么需要访问权限控制
我已经在Java编程的道路上混迹了多年,自然也写过无数曾经看起来那么“优秀”的代码。随着时间的推移,再回首过往的那些代码时,总有一种“这真的出自我手?”的疑问。
这种疑问包含两层意思,一层是感慨真的写得好,就好像年老时的李白看见自己年少时写的《望庐山瀑布》:“日照香炉生紫烟,遥看瀑布挂前川;疑是银河落九天,飞流直下三千尺。”——哟,老子年轻时写得也不赖啊。
另外一层是感慨真的写得差,比如说程序清单1-1,往事不堪回首啊,只能都随风,都随风,都随风而去!
对于这些写得很差的代码,我每次看见都想再修改一次,期待她更可读、更易理解、更具可维护性;但在美好的愿景下,也存在着巨大的压力,因为有好多其他的地方引用了要修改的代码,牵一发而动全身啊。
在变与不变的过程中,我发现——访问权限控制真的太重要了。在写代码的过程中,我们需要尽量遵循这样一个原则——除了那些必须public的方法,尽量把其他方法定义为private。这样做的好处是,在重构private方法的时候不必再担惊受怕,因为它们不会被类外部访问到。
03 protected权限修饰符是用来干嘛的
我们知道,public权限修饰符使类的一切方法和属性对外可见;private权限修饰符使类的一切方法和属性只对内部可见;那么protected权限修饰符呢?
假如有一个叫王二的家伙,他有三个属性,分别是私生活、外在形象和被保护的财产,就像程序清单3-1那样。
程序清单3-1:
public class Wanger {
// 私生活 private String life;
// 外在形象 public String image;
// 被保护的财产 protected String money;}
王二生了一个孩子叫王小二,就像程序清单3-2那样。
程序清单3-2:
public class Wangxiaoer extends Wanger{ @Override public String toString() { return "可以继承的财产:" + money + ";塑造的人设:" + image + ";得不到的私生活:"; }}
王小二可以继承到王二的财产money(据说王二在王小二出生的第一个月为其存了100,以后每个月的利率为12%,现在存款是3758.17,你知道王小二现在多大了吗?),也可以模仿一点父亲的外在形象image,但却不能按照父亲的私生活方式生活。
注意到三个权限修饰符的区别了吗?
protected可以保护王二的财产顺利地继承到王小二那里,外界的人是访问不到的;public不安全,因为不仅王小二可以继承访问,外界其他人也可以访问;private太私有化,不仅外界访问不到,王小二也继承不到。
04 总结
访问权限控制的两个重要作用:第一是为了防止外界触碰到不该触碰的地方(private修饰的成员变量或者方法);第二是让类的设计者可以更改内部(private修饰的成员变量或者方法)的工作方式,而不必担心有没有对外界造成干扰。
论Java访问权限控制的重要性的更多相关文章
- [THINKING IN JAVA]访问权限控制
6 访问权限控制 6.1 包:库单元 package.import.import *.import static: 修改classpath环境变量可以将自己写的类库添加至环境变量并在任何java程序中 ...
- JAVA访问权限控制[zhuan]
Java的访问权限控制修饰符,从最大权限到最小权限依次是:public.protected.包访问权限(默认,没有关键字)和private.对于类的访问权限只能是:public和包访问权限(但内部类可 ...
- Java访问权限控制
访问权限控制 java提供了访问权限修饰词,以供类库开发人员向客户端程序员指明哪些是可用的,哪些是不可用的.访问权限控制的等级,从最大权限到最小权限依次是:public.prote ...
- Java 访问权限控制:你真的了解 protected 关键字吗?
摘要: 对于类的成员而言,其能否被其他类所访问,取决于该成员的修饰词:而对于一个类而言,其能否被其他类所访问,也取决于该类的修饰词.在Java中,类成员访问权限修饰词有四类:private,无(包访问 ...
- Java 访问权限控制 小结
总所周知,Java提供了访问权限修饰词,以供类库开发人员向客户端程序员指明哪些是可用的,哪些是不可用的. 访问权限控制的等级,从最大权限到最小权限依次为:public.protected.包访问权限( ...
- java 访问权限控制
java提供四种访问权限: public > protected > 包访问权限(无关键词) > private 包:库单元 对于包访问权限,一个包内的都可以访问. 在eclipse ...
- Java 访问权限控制- protected 关键字
protected 关键字的真正内涵 文章来源:http://blog.csdn.net/justloveyou_/article/details/61672133 很多介绍Java语言的书籍(包括& ...
- (转)浅析Java中的访问权限控制
原文地址: http://www.cnblogs.com/dolphin0520/p/3734915.html 今天我们来一起了解一下Java语言中的访问权限控制.在讨论访问权限控制之前,先来讨论一下 ...
- Java成员的访问权限控制
Java中的访问权限控制包含两个部分: 类的访问权限控制 类成员的访问权限控制 对类来说,访问权限控制修饰符可以是public或者无修饰符(默认的包访问权限): 对于类成员来说,访问权限控制修饰符可以 ...
随机推荐
- [原创]windows 部署SS server 出现的错误.
安装过程: .Download and install Python MSI installer in 64bit Windows. .During installation you should i ...
- symfony小练习-表白墙
过上一个博客系统以及对官方示例程序的基本学习,目前对symfony的各个组件有了一定的学习,学校布置了一个表白墙任务,这里就这个任务的完成进行记录 ...........2019.3.20.22.31 ...
- 基于centos7系统部署cobbler
准备环境和下载cobbler 一,系统准备 虚拟机下要添加两个网卡.一个仅主机对内提供cobbler服务,一个桥接用来通外网 系统版本为:CentOS 7.5 内网ip :169.254.1.6 # ...
- 把网站打包快速在线生成ios app的正确方法
下方的内容不用看了,请点这里 !点这里!IOS APP自助生成系统已上线,请马上去了解下: http://www.tao-jiujiu.com/post/188.html ============= ...
- PHP命名空间与自动加载类详解
本文实例讲述了PHP命名空间与自动加载类.分享给大家供大家参考,具体如下: 今天我要给大家介绍的是PHP的命名空间 和 自动加载类 我先简单的分开演示 在放在一起 大家请看:什么是自动加载类? 想必大 ...
- 用ttBulkCp把excel中的数据导入到timesten数据库中
最近要做数据预处理,需要用到数据库.而且是以前从来没听说过的TimesTen. 首要目标是要把Excel里的数据,导入到TimesTen数据库中.而TimesTen在win10里用不了,于是我就在虚拟 ...
- python操作git
GitPython 是一个用于操作 Git 版本库的 python 包,它提供了一系列的对象模型(库 - Repo.树 - Tree.提交 - Commit等),用于操作版本库中的相应对象. 模块安装 ...
- python学习笔记(6)
第6章 组合数据类型 组合类型的三种表达形式:集合.序列.字典 集合类型及操作 定义:集合是多个元素的无序组合 集合类型与数学中的集合概念一致 集合元素之间无序,每个元素唯一,不存在相同元素 集合元素 ...
- Linux结束进程到底有多少种方法?
我们经常在Linux里使用kill命令来结束某后台进程.但kill命令实际上是向进程发送信号,并且有多种信号.终止运行一个程序只是其中一个信号而已.kill是根据进程号发送信号的,而另一个工具kill ...
- [zt]C++二维数组讲解、二维数组的声明和初始化
定义: int *pia = new int[10]; // array of 10 uninitialized ints 此 new 表达式分配了一个含有 10 个 int 型元素的数组,并返回指向 ...