public class Test3 extends Test4
{
    int i=30; 
    Test3(){
     print();
        i=40;
    } 
    void print(){
        System.out.println(this.i);
    } 

class Test4 { 
    int i=10;    Test4(){
     print();
        i=20;
    } 
    void print(){
        System.out.println(this.i);
    }
}
class Test3demo{
public static void main(String[] args) {
        System.out.println(new Test3().i);
    } 
}
结果是0,30,40.  30和40好理解   0应该是Test4的print方法 应该是10啊
为什么是0呢???  谁给解答一下!!!!!

解决方案 »

  1.   

    Test3中的print是改写了Test4中的那个Test3中的print会打印Test3的i,注意,这里是打印Test3的i
    Test4的构造中调用了print,因为实际是Test3的实例,所以调用的是Test3的print。但是,在构造Test3之前会构造Test4,而构造Test4的时候,调用了重载的print,这里打印的Test3的i还没有初始化i,所以i就是默认值0了。i要在构造了Test4之后构造Test3的时候才会初始化。因为关系比较复杂,自己要多想想,不好说清楚的。
      

  2.   

    运行的时候不是应该先跑父类构造吗??? 父类构造调用print()方法 这里的i为什么不是10??  int i=10已经初始化了啊??
      

  3.   

    父类的print被子类覆了,所以调用的是子雷的print。打印的是子雷还没有初始化的i
      

  4.   

    非static成员变量的初始化,要么在构造函数的父构造函数执行之后并且自己的构造函数执行之前进行初始化。