+
 新版

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

单曲循环shield 发布于 2015/08/22 13:43
阅读 807
收藏 0
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()
//而函数里引用变量确是找父类或自己的类,而不找子类的变量??????
加载中
0
如比如比
如比如比
实例的同名方法被覆盖,对于实例c,d,Child.g()覆盖了Parent.g()。所以执行f()时,执行的是Child的g()。
如果有static修饰的话是被隐藏,而不是覆盖。
变量的话一般都是被隐藏。在Parent类中没有对name进行重新定义,所以f()中能打印出继承类A的name。
当然如果Child的某个方法中使用了name的话,它的值应该是2.


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


0
ksfzhaohui
ksfzhaohui
2个name变量就不是同一个变量,当然不会找
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部