public class T{
public static void main(String[] args){
C cc = new C();
}
}
class A{
int i = 55;
public A(){
show();
}
public void show(){
// System.out.println("A show()");
System.out.println(i);
}
}
class C extends A{
int i = 88;
public void show(){
// System.out.println("C show()");
// System.out.println(super.i);
System.out.println(this.i);
}
}

解决方案 »

  1.   

    C cc = new C();调用C的构造函数   因为C继承A类 所以先调用public A();执行show();
    子类show();覆盖了父类A的   其执行过程中i=55;i=88;没有执行的机会,所以i是默认的0;
    所以输出为0;
    System.out.println(this.i);这里this没用  并不是this.i, i就是本类中定义的i了
      

  2.   


    调用public A()的时候是执行的父类中的show()还是执行的子类中的show() 好像不会执行父类中的
    为什么执行的过程中就没有机会执行i呢 是不是存在子类中存在两个i 那系统到底应该调用哪一个呢  所以系统就不会调用这两个i了 而是选的默认值 这样想对不对
      

  3.   

    C cc = new C();调用C的构造函数 因为C继承A类 所以先调用public A();执行show();
    子类show();覆盖了父类A的 其执行过程中i=55;i=88;没有执行的机会,所以i是默认的0;
    所以输出为0;
      

  4.   

    当在调用A的构造函数的时候,由于方法的覆盖调用C的show()方法但是此时C的成员变量还没有初始化。因此i的值默认是0
      

  5.   

    初始化的实际过程:
    1)在其他任何事物发生前,将分配给各个对象的存储空间初始化为二进制的零~
    2)调用基类构造器。此时,调用被覆盖的show()方法。由于1)的原因.i=0;
    3)按照声明的顺序调用成员的初始化方法.-----thinking in java有详细说明的~建议楼主去看看~
      

  6.   

    java 初始化顺序是:
    父类初始化块---->父类构造方法---->子类初始化块---->子类构造父类A构造方法调用了被重载的show方法,此时走子类C的show(),而show使用了子类未初始化的i,所以是0
      

  7.   

    正确,可以把子类的int i = 88 变成静态的static int i = 88就OK了。
    父类静态块---->子类静态块---->父类非静态块---->父类构造方法---->子类非静态块---->子类构造方法class A{
    int i = 55;
    {
    System.out.println("noneStaticBlock A");
    System.out.println(i);
    }
    static{
    System.out.println("staticBlock A");
    }
    public A(){
    show();
    }
    public void show(){
    System.out.println(i);
    }
    }
    class C extends A{
    int i = 88;
    {
    System.out.println("noneStaticBlock C");
    System.out.println(i);
    }
    static{
    System.out.println("static C");
    }
    public void show(){
    System.out.println(i);
    }
    }
    public class Test{
    public static void main(String args[]){
    C c = new C();
    }
    }