Java中方法的重写与成员变量的隐藏
这篇文章讨论了Java面向对象概念中一个基本的概念–FieldHiding(隐藏成员变量)
在讨论这个问题之前,我们看一段特别特别简单的代码,请问一下方法的数据结果是什么?
/** *@authorHollis17/9/27. */publicclassFieldOverriding{ publicstaticvoidmain(String[]args){ Subc1=newSub(); System.out.println("c1.s:"+c1.s); System.out.println("c1.say:"+c1.say()); Superc2=newSub(); System.out.println("c2.s:"+c2.s); System.out.println("c2.say:"+c2.say()); } } classSuper{ Strings="Super"; Stringsay(){ return"helloSuper"; } } classSubextendsSuper{ Strings="Sub"; Stringsay(){ return"helloSub"; } }
输出结果:
c1.s:Sub c1.say:helloSub c2.s:Super c2.say:helloSub
和你想的一样吗,如果一样的话,那就不用继续往下看了。因为这个本来就不难,知道了就行。
Java中的重写
在深入理解Java中的重写和重载中我们介绍过:
在Java的子类与父类中有两个名称、参数列表都相同的方法的情况。由于他们具有相同的方法签名,所以子类中的新方法将覆盖父类中原有的方法。
正式因为Java在继承中有方法的重写,所以,这也体现了Java的动态多态性。
成员变量在Java中能够被重写么?
上面的Java的重写介绍中明确的说了,重写,指的是方法。并没有提到成员变量。通过上面的例子,其实我们也可以发现,成员变量并没有被重写。
所以,Java中,成员变量并不会被重写。这里就有另外一个词:隐藏。
Java中成员变量的隐藏
Java文档中对隐藏域的定义:
Withinaclass,afieldthathasthesamenameasafieldinthesuperclasshidesthesuperclass'sfield,eveniftheirtypesaredifferent.Withinthesubclass,thefieldinthesuperclasscannotbereferencedbyitssimplename.Instead,thefieldmustbeaccessedthroughsuper.Generallyspeaking,wedon'trecommendhidingfieldsasitmakescodedifficulttoread.
翻译成中文:
在一个类中,子类中的成员变量如果和父类中的成员变量同名,那么即使他们类型不一样,只要名字一样。父类中的成员变量都会被隐藏。在子类中,父类的成员变量不能被简单的用引用来访问。而是,必须从父类的引用获得父类被隐藏的成员变量,一般来说,我们不推荐隐藏成员变量,因为这样会使代码变得难以阅读。
其实,简单来说,就是子类不会去重写覆盖父类的成员变量,所以成员变量的访问不能像方法一样使用多态去访问。
如何访问被隐藏的成员变量
其实,通过前面的例子,和刚刚关于成员变量的介绍,其实你已经知道了如何访问被隐藏的成员变量。就是使用父类的引用来访问成员变量,如Superc2=newSub();System.out.println("c2.s:"+c2.s);。或者使用System.out.println(((Super)c1).s);。
总结
以上所述是小编给大家介绍的Java中方法的重写与成员变量的隐藏,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!