Java 访问权限控制:public、private、protected

简介: Java 访问权限控制:public、private、protected

本篇文章主要介绍 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{

@Override

public String toString() {

 return "可以继承的财产:" + money + ";塑造的人设:" + image + ";得不到的私生活:";

}

}


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


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


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


04、 总结


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


相关文章
|
20天前
|
SQL Java 数据库连接
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率。本文介绍了连接池的工作原理、优势及实现方法,并提供了HikariCP的示例代码。
34 3
|
22天前
|
SQL Java 数据库连接
打破瓶颈:利用Java连接池技术提升数据库访问效率
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,避免了频繁的连接建立和断开,显著提升了数据库访问效率。常见的连接池库包括HikariCP、C3P0和DBCP,它们提供了丰富的配置选项和强大的功能,帮助优化应用性能。
43 2
|
1月前
|
Java
Java访问外网图片地址时,如何添加代理?
【10月更文挑战第14天】Java访问外网图片地址时,如何添加代理?
26 2
|
2月前
|
Java
java基础(4)public class 和class的区别及注意事项
本文讲解了Java中`public class`与`class`的区别和注意事项。一个Java源文件中只能有一个`public class`,并且`public class`的类名必须与文件名相同。此外,可以有多个非`public`类。每个类都可以包含一个`main`方法,作为程序的入口点。文章还强调了编译Java文件生成`.class`文件的过程,以及如何使用`java`命令运行编译后的类。
40 3
java基础(4)public class 和class的区别及注意事项
|
1月前
|
小程序 Java
小程序访问java后台失败解决方案
小程序访问java后台失败解决方案
44 2
|
1月前
|
小程序 JavaScript Java
小程序访问java后台
小程序访问java后台
27 1
|
1月前
|
存储 Java
深入理解java对象的访问定位
这篇文章深入探讨了Java对象的访问定位机制,比较了使用句柄和直接指针两种主流的对象访问方式,并指出了它们各自的优势,例如句柄访问在对象移动时的稳定性和直接指针访问的速度优势。
34 0
深入理解java对象的访问定位
|
2月前
|
存储 Java 关系型数据库
java: 无法访问org.springframework.context.ConfigurableApplicationContext
`亲测可用,之前搜索了很多博客,啥样的都有,就是不介绍报错以及配置用处,根本不懂照抄那些配置是干啥的,稀里糊涂的按照博客搭完也跑不起来,因此记录这个。` `项目背景`:公司项目当前采用http协议+shiro+mysql的登录认证方式,而现在想支持ldap协议认证登录然后能够访问自己公司的项目网站。 `举例说明`:假设我们公司有自己的门户网站,现在我们收购了一家公司,他们数据库采用ldap存储用户数据,那么为了他们账户能登陆我们公司项目所以需要集成,而不是再把他们的账户重新在mysql再创建一遍,万一人家有1W个账户呢,不累死了且也不现实啊。
50 11
|
2月前
|
安全 Java 编译器
java访问字段
java访问字段
26 6
|
2月前
|
安全 Java 编译器
java访问类字段
java访问类字段
下一篇
无影云桌面