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

一个基础的问题
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呢???     谁给解答一下!!!!!

------解决方案--------------------
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的时候才会初始化。

因为关系比较复杂,自己要多想想,不好说清楚的。