故事背景java
看过《哈利·波特》的娃们,想必必定还记得电影中的“隐形斗篷”。。这件隐形衣是哈利收到的圣诞礼物,也是死亡圣器中的三件套之一,它让哈利小盆友在执行任务的过程当中简直是如虎添翼!ide
其实说白了,隐身衣所包裹的就是人类本能的掌控欲与窥探欲,咱们渴望知道和了解全部事,但不少时候又不想让别人知道,因此咱们须要“隐身衣”。。spa
继承Inheritance/隐藏hide/覆写overridecode
java中有继承Inheritance/隐藏hide/覆写override的概念,咱们暂且无论他们的区别,先看看最近发生的一件小事,boss在开会时说错了一个数字,Leader赶忙说:”那是我弄错的“,程序猿想找到Boss说的数字时,却怎么也不行,这是怎么回事呢?请看案情回放:blog
public class Conference { public static void main(String[] args) { System.out.println(new Leader().sales); } } class Boss { public Integer sales=10000; } class Leader extends Boss{ private Integer sales=9000; }
咋一看,会打印Leader的销售量数据9000,但仔细分析来看,Leader类的sales变量是私有的,程序不能编译经过。该程序确实不能编译,可是错误出在Conference类中。缘由:在Conference中调用的是new Leader()即leader的实例,不是Leader类,一个覆写方法的访问修饰符所提供的访问权限与被覆写方法的访问修饰符所提供的访问权限相比,至少要同样多[JLS 8.4.8.3]。继承
由于sales是一个域,因此Leader.sales隐藏(hide)了Boss.sales,而不是覆盖了它[JLS 8.3]。对一个域来讲,当它要隐藏另外一个域时,若是隐藏域的访问修饰符提供的访问权限比被隐藏域的少,尽管这么作不可取的,可是它确实是合法的。it
其实咱们仍是能够找到老板的所说的sales的。以下:io
public class Conference { public static void main(String[] args) { System.out.println(((Boss)new Leader()).sales); } } class Boss { public Integer sales=10000; } class Leader extends Boss{ private Integer sales=9000; }
总结编译
覆写与隐藏之间的一个很是大的区别。一旦一个方法在子类中被覆写,你就不能在子类的实例上调用它了(除了在子类内部,经过使用super 关键字来方法)。然而,你能够经过将子类实例转型为某个超类类型来访问到被隐藏的域,在这个超类中该域未被隐藏。class
参考资料
【1】java解惑
【2】https://www.sohu.com/a/231064552_764920