java继承和多态相关问题,方法里调用成员变量why是在类本身或其父类找,而不在子类找?跟方法调用不一样
class A{ int name = 1; } class Parent extends A{ public void f(){ System.out.println(name); //name不是指this.name么? g(); } public void g(){ System.out.println("parent"); } } class Child extends Parent{ int name = 2; public void g(){ System.out.println("child"); } } public class Hello { public static void main(String[] args) { Child c = new Child(); c.f(); //为什么f()函数输出name不是2?? Parent d = new Child(); d.f(); } } //为什么调用函数就是当前对象g() //而函数里引用变量确是找父类或自己的类,而不找子类的变量??????
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
2个name变量就不是同一个变量,当然不会找
实例的同名方法被覆盖,对于实例c,d,Child.g()覆盖了Parent.g()。所以执行f()时,执行的是Child的g()。
如果有static修饰的话是被隐藏,而不是覆盖。
变量的话一般都是被隐藏。在Parent类中没有对name进行重新定义,所以f()中能打印出继承类A的name。
当然如果Child的某个方法中使用了name的话,它的值应该是2.
隐藏 和覆盖 的区别在于,子类对象转换成父类对象后,能够访问父类被隐藏 的变量和方法,而不能访问父类被覆盖 的方法。