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为什么子类里面的变量取不出来?
谁帮我分析下  谢谢!!

解决方案 »

  1.   

    你直接在main函数中调用Child对象的show就可以去除子类的对象
      

  2.   

    java类实例初始化顺序是先调用构造方法,然后再初始化实例变量。
    也就是说在你调用构造方法时,x=20这个操作还没有执行,此时x仅有一个默认的初始值0,所以,构造方法里面取得的x值是0。如果你在构造方法结束后,在调用show(),就会得到正确值了。
    你可以试试这个,你就明白了。public class TestConstructorPoly {
    public static void main(String[] args) {
    new Child().show();
    }
    }结果是:int Child 0
    int Child 20
      

  3.   

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

  4.   

    如果是先初始化实例变量,再执行构造方法,在给变量赋值这个顺序.class Parent{
    public int x = 10;
    public Parent(){
    System.out.println("in Parent "+x);
    }
    }
    那么现在 我直接new一个Parent 这里x应该是0  为什么它又取到了x=10?