public class Test extends Test1{
int i=30;
Test(){
print();
i=40;
}
public static void main(String[] args) {

System.out.println(new Test().i);//40
 
 
}
void print(){
System.out.println(i);// 0 30
}
}
class Test1 {
int i=10;
Test1(){
print();
i=20;
}
void print1(){
System.out.println(i);
}
}

解决方案 »

  1.   

    那个System.out.println(new Test().i);
    第一不先运行那个Test1()的构造函数
        里面有那个print()被子类test重写了,就是被覆盖了,(这样覆盖还是第一次见^_^,没实际意义)
        她那个i值不能调回那个i=10,结果就默认了个i=0;掉回
    第一运行Test()出来个30
           .i就出来个40
      

  2.   

    java是天生动态绑定的。
    再你的例子中实例化类Test,先调用父类Test1的构造函数而你里面有print()方法,他会调用Test类里面的print()方法而不调用Test1的print(),而i还没有实例,所以i=0;
    之后调用Test的构造函数,里面有print()方法,打印出i=30;然后给i赋值i=40;
    最后是打印".i"的值 i=40。
      

  3.   

    to:key_feng(射手之№雏)
    好,讲的透彻!
      

  4.   

    classjava(原始野人) 和 key_feng(射手之№雏)  分析得都对。我也算是弄懂了
    创建本类对象,执行构造函数的时候首先去调用父类的构造函数。但不巧的是你的程序里覆盖了父类的print,所以就调用你的print了。
    你可以把程序小做修改,就看出来效果了。比如,去掉子类的print定义,看看,他就输出了父类的i值。public class Test extends Test1{
    int i=30;
    Test(){
    print();
    i=40;
    }
    public static void main(String[] args) {
    System.out.println(new Test().i);
    }
    //void print(){
    //System.out.println("t");
    //}
    }
    class Test1 {
    int i=10;
    Test1(){
    print();
    i=20;
    }
    void print(){
    System.out.println(i);
    }
    }
    //还可以多做小的修改,不断查看分析结果,就更明白了。