前言
- private关键词是面向对象语言实现封装的重要组成部分。就像是儿子撕葱虽然能继承父亲优秀的基因(方法)和恐怖的家产(变量),但父亲的一些私人物品是撕葱同学最好不要获得的(比如父亲初恋情人写给自己的信)。合理使用private关键词可以极大地发挥面向对象的优点。
- final关键词则是Java中声明常量的一种方法。被final关键词击中后,变量将无法修改,函数将无法被覆盖,类将失去继续被继承的能力,瞬间花容失色。可见此君威力巨大,虽然会使当事人失去很多能力,但可以极大地提高编译和运行的效率,因此合理利用final,能更加极致地提升Java的性能。
如果一个方法不想在被继承之后被覆盖,可以声明为final。
但为什么说private方法在覆盖时不必声明final呢?
什么时候不想被覆盖
有的同学会问,什么地方会导致我们想要声明private final 这样的方法(变量)呢?
比如父亲会担心,儿子不小心把信箱里的信全部换成自己的(覆盖),导致父亲找不到初恋情人写给自己的信,这种事情的后果是不堪设想的。父亲为了防止自己的信被儿子的信覆盖,就会想方设法把这封信藏起来,就想声明
private final getLetter()
这个方法。
这么做有必要吗
我们来看代码和执行情况
public的覆盖情况
假设一个情景:
父亲有一辆车Auto,儿子从父亲那里继承了一张车Car
儿子和父亲都能从车库开车,即使用getDrive()
儿子如果把车停在自家车库(覆盖了父亲的车),父亲想要开车库里的车,就只能开儿子的车了。
调用及输出结果如下:
结果:
如果父亲把家里车库锁起来,不让儿子继承取车方法,则儿子将无法覆盖getDrive()方法
这时,回到我们最初的假设,即private方法能不能被覆盖。
如果能,则一定要声明final,不能让儿子把这封信覆盖了。
如果不能,则无需担心这个问题,即儿子根本找不到这封信。
真相只有一个。
private的覆盖情况
儿子继承了父亲的一切,打算覆盖getLetter()方法
父亲来到信箱前,翻了一团糟。
结果发现儿子的箱子里有儿子的信,而自己的信,依然躺在自己的箱子里,没有被儿子覆盖
事已至此,父亲长吁了一口气,面露喜色地累瘫在地上。
总结
看来private方法在声明后,不仅只是本类的对象可见而已,在别的类看来,这个类甚至可以说根本没有这个方法。
因此就不存在覆盖的问题了,也就不必声明final来限制覆盖。