论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或者无修饰符(默认的包访问权限): 对于类成员来说,访问权限控制修饰符可以 ...
随机推荐
- Java - 数组详解(图解数组的基本操作)
目录 什么是数组 数组的定义和内存分配 数组的赋值和访问 数组的注意事项 数组的内存图解 数组的插入 数组的删除 数组的扩容 数组的反转 首先 什么是数组 数组是一组地址连续.长度固定的具有相同类型的 ...
- Django--post提交表单内容
本节目标:①.提交表单内容②.通过客户端提交表单新增一篇文章③.通过Django的forms组件来完成新增一篇文章 =======提交表单内容======== 1.前端html:login.html ...
- 了解 ptyhon垃圾回收机制
Python的GC模块主要运用了“引用计数”(reference counting)来跟踪和回收垃圾.在引用计数的基础上,还可以通过“标记-清除”(mark and sweep)解决容器对象可能产生的 ...
- python之socketserver实现并发
python之socketserver实现并发 服务端 import socketserver #socketserver模块是用来实现并发 # 我们自己的类里一定要继承socketserver.Ba ...
- VSTO 基础随笔
1.往组合框添加条目 With Me .ComboBox1.Items .Add( "Ports" ) .Add( "Igor" ) End With 2.文本 ...
- Annotation(注解)
注解相当于一种标记,在程序中加入注解就相当于为程序打上某种标记,没有加,则表示没有任何标记,以后,javac编译器.开发工具和其它程序可以通过反射来了解你的类及各种元素上有无何种标记,看你的程序有什么 ...
- scrapy初始和简单应用
什么是Scrapy Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,非常出名,非常强悍.所谓的框架就是一个已经被集成了各种功能(高性能异步下载,队列,分布式,解析,持久化等)的具有 ...
- Run Keyword And Ignore Error,Run Keyword And Return Status,Run Keyword And Continue On Failure,Run Keyword And Expect Error,Wait Until Keyword Succeeds用法
*** Test Cases ***case1 #即使错误也继续执行,也不记录失败,且可以返回执行状态和错误信息 ${Run Keyword And Ignore Error status} ${st ...
- 如何给小学生讲清楚ECC椭圆曲线加密
对于RSA这套公私钥加密的思路,我以为我挺明白的,运用的娴熟自如. 当然现在RSA用的不多,而是基于ECC曲线来做签名验签,最大名鼎鼎的莫过于比特币. 可是前两天和别人讲代码,被问了ECC为什么可以用 ...
- ThreadLocal与线程池使用的问题
感谢博主的这篇分享,见 https://www.cnblogs.com/qifenghao/p/8977378.html 在今天的面试中,突然被考官问了这个问题,当时脱口而出的是 threadloca ...