日期:2014-05-20  浏览次数:20663 次

关于继承和多态的问题 帮忙分析下代码
class Parent{
public int x = 10;
public void show(){
System.out.println("in Parent "+x);
}
public Parent(){
show();
}
}

class Child extends Parent{
public int x = 20;
public void show(){
System.out.println("int Child "+x);
}
}

public class TestConstructorPoly{
public static void main(String[]args){
new Child();
}
}

结果输出是 int Child 0

为什么子类里面的变量取不出来?
谁帮我分析下 谢谢!!

------解决方案--------------------
java类实例初始化顺序是先调用构造方法,然后再初始化实例变量。
也就是说在你调用构造方法时,x=20这个操作还没有执行,此时x仅有一个默认的初始值0,所以,构造方法里面取得的x值是0。如果你在构造方法结束后,在调用show(),就会得到正确值了。
你可以试试这个,你就明白了。
Java code

public class TestConstructorPoly {
    public static void main(String[] args) {
        new Child().show();
    }
}

------解决方案--------------------
2楼正解,补充一点,java类实例初始化时,是先初始化实例变量,再执行构造方法,子类继承父类,所以先实例化父类,因为子类覆写了父类同名方法,所以调用是的子类的同名方法,这个时候子类还未初始化,因此x为“0”
,如果是new Parent();则会有值,或者把子类show()方法改名,效果又不一样,楼主可以试一下!