本篇文章主要介绍 Java 的访问权限控制。先问大家一个问题:人在什么面前最容易失去抵抗力?

美色,算是一个,比如说西施的贡献薄就是忍辱负重、以身报国、助越灭吴;金钱,算是另外一个,我们古人常说“钱乃身外之物,生不带来死不带去”,但我们又都知道“有钱能使鬼推磨”。

除去美色和金钱,我认为还有一个,就是读者的认可——“二哥,你的文章真的很棒,我特别喜欢。希望能多多更新 Java 基础知识,真的是受益良多,就好像是在读王小波的散文,但又学了编程!”——你说,收到读者这样暖暖的评语,还需要美色和金钱?“两者皆可抛”嘛。

01、public 的惨案

舒淇曾说过这样一句令人感到震撼后又虎躯一震的话:“我要把我曾经脱下的衣服一件一件的穿回来!”如今,她做到了——通过自己的努力,不仅得到了观众的认可,得了很多大奖,还收获了幸福。尽管,真的是尽管,还有一些“忆往昔峥嵘岁月稠”的朋友在电脑硬盘的深处留存了一些舒淇早年的珍藏版照片(「沉默王二」公众号后台回复“1024”有你想不到的惊喜)。

我扯这个例子主要为了证明一句话——访问控制(或隐藏具体实现)与“最初的实现并不恰当”有关——如果舒淇当初那些照片的权限不是那么公开化的话,那现在就可以私自烧毁了;或者换一种出道方式;然而没有如果了。

在你最初的编程生涯中,不知道你是否创作过下面这样“优秀”的代码,就像程序清单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、 private 更易重构

我已经在 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{@Overridepublic String toString() {return "可以继承的财产:" + money + ";塑造的人设:" + image + ";得不到的私生活:";}
}

王小二可以继承到王二的财产 money(据说王二在王小二出生的第一个月为其存了 100,以后每个月的利率为 12%,现在存款是 3758.17,你知道王小二现在多大了吗?),也可以模仿一点父亲的外在形象 image,但却不能按照父亲的私生活方式生活。

注意到三个权限修饰符的区别了吗?

protected 可以保护王二的财产顺利地继承到王小二那里,外界的人是访问不到的;public 不安全,因为不仅王小二可以继承访问,外界其他人也可以访问;private 太私有化,不仅外界访问不到,王小二也继承不到。

04、 总结

访问权限控制的两个重要作用:第一是为了防止外界触碰到不该触碰的地方(private 修饰的成员变量或者方法);第二是让类的设计者可以更改内部(private 修饰的成员变量或者方法)的工作方式,而不必担心有没有对外界造成干扰。


上一篇:Java是通过什么机制来确保对象初始化呢?

下一篇:Java代码复用的三种常用方式:继承、组合和代理

微信搜索「沉默王二」公众号,关注后回复「免费视频」获取 500G Java 高质量教学视频(已分门别类)。

Java 访问权限控制:public、private、protected相关推荐

  1. Java访问权限(public、protected、友好的、private)定义

    访问权限定义: 1.访问权限指:对象是否可以通过 " . " 运算符操作自己的变量 或 通过 " . " 运算符调用类中的方法: 2.访问权限修饰符:priva ...

  2. Java访问修饰符public,private,protected,以及不写(默认)时的区别?

    修饰符 当前类 同 包 子 类 其他包 public √ √ √ √ protected √ √ √ × default √ √ × × private √ × × × 类的成员不写访问修饰时默认为d ...

  3. java权限控制是什么_论Java访问权限控制的重要性

    人在什么面前最容易失去抵抗力? 欢迎工作一到八年的Java工程师朋友们加入Java高级交流:854630135 本群提供免费的学习指导 架构资料 以及免费的解答 不懂得问题都可以在本群提出来 之后还会 ...

  4. Java访问权限控制

    面向对象的核心思想之一就是封装,只把有限的方法和成员公开给别人,这也是迪米特法则的内在要求,是外部调用方对方法体内的实现细节知道得尽可能少. 如何实现封装呢? 需要使用某些关键字来限制外部对类内属性和 ...

  5. [THINKING IN JAVA]访问权限控制

    6 访问权限控制 6.1 包:库单元 package.import.import *.import static: 修改classpath环境变量可以将自己写的类库添加至环境变量并在任何java程序中 ...

  6. JAVA访问权限控制[zhuan]

    Java的访问权限控制修饰符,从最大权限到最小权限依次是:public.protected.包访问权限(默认,没有关键字)和private.对于类的访问权限只能是:public和包访问权限(但内部类可 ...

  7. java 访问权限控制

    java提供四种访问权限: public > protected > 包访问权限(无关键词) > private 包:库单元 对于包访问权限,一个包内的都可以访问. 在eclipse ...

  8. 深入浅出OOP(五): C#访问修饰符(Public/Private/Protected/Internal/Sealed/Constants)

    访问修饰符(或者叫访问控制符)是面向对象语言的特性之一,用于对类.类成员函数.类成员变量进行访问控制.同时,访问控制符也是语法保留关键字,用于封装组件. Public, Private, Protec ...

  9. Java中四个访问修饰符public private protected 和默认(package-private)的用法详解

    访问级别 访问级别修饰符确定其他类是否可以使用特定字段或调用特定方法.有两个级别的访问控制: 1.在顶级 public或package-private(没有显式修饰符即默认权限). 类可以用修饰符pu ...

  10. Java访问权限控制简述

    四种访问权限 Java中类与成员的访问权限共有四种,其中三种有访问权限修饰词:public,protected,private,. Public:权限最大,允许所有类访问,但其他包下的类想要访问需使用 ...

最新文章

  1. 编写Thymeleaf视图以展示数据
  2. 条件随机场(Conditional random fields,CRFs)文献阅读指南
  3. java8 遍历目录_使用java8API遍历过滤文件目录及子目录及隐藏文件
  4. python调用winrar解压_批量文件解压缩脚本(Python3.5 + WinRAR)
  5. cocos2d-x游戏实例(19)-纵版射击游戏(6)
  6. 关于ICallbackEventHandler的疑问
  7. asp.net 发送邮件函数两则
  8. Redis__WindowsServer主从服务部署及调用实例
  9. python元组和集合的区别_python 元组与list的区别
  10. 【转】当inline-block和text-indent遇到IE6,IE7
  11. python django mysql_Python之模块、函数和缩进
  12. CCNA配置试验之八 帧中继——点到点子接口(point-to-point)的配置
  13. echarts 关系图 参数_Echarts关系图(使用重力图)
  14. C++11多线程 unique_lock详解
  15. java编码什么时候需要增加空格_Java编码规范之声明和空白,空格
  16. win10开机字体变大bug
  17. 联发科有没有高端处理器_联发科处理器哪些好 2019联发科处理器排名
  18. 【组队学习】【33期】组队学习内容详情
  19. 微信公众号消息通知(原生)
  20. 【前端-Js基础方法】字符串常用方法汇总

热门文章

  1. System Verilog 语法1
  2. FPGA综合项目——SDRAM控制器
  3. PWM波转DC直流之二阶RC低通滤波器设计
  4. 思科产品手册_品牌和CIS在中国的历史(六):附下载世界帆船协会品牌管理手册...
  5. 数学物理计算机的思考
  6. FPGA硬件加速综述
  7. Python3抓取糗百、不得姐、kanqu.com
  8. MATLAB离散控制系统
  9. Iphone5的机身4S的配置 山寨版“iPhone 5S”上手视频
  10. win7专业版激活方案