java继承和多态相关问题,方法里调用成员变量why是在类本身或其父类找,而不在子类找?跟方法调用不一样

发布于 2021-11-29 09:41:39 字数 679 浏览 787 评论 2

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

伪装你 2021-11-30 09:19:53

2个name变量就不是同一个变量,当然不会找

猫性小仙女 2021-11-30 02:26:54

实例的同名方法被覆盖,对于实例c,d,Child.g()覆盖了Parent.g()。所以执行f()时,执行的是Child的g()。

如果有static修饰的话是被隐藏,而不是覆盖。

变量的话一般都是被隐藏。在Parent类中没有对name进行重新定义,所以f()中能打印出继承类A的name。

当然如果Child的某个方法中使用了name的话,它的值应该是2.

隐藏 和覆盖 的区别在于,子类对象转换成父类对象后,能够访问父类被隐藏 的变量和方法,而不能访问父类被覆盖 的方法。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文