一个让98%的Java程序员犯难的偏门问题!

来源:互联网 发布:电工制图软件下载 编辑:程序博客网 时间:2024/05/16 12:41

    在csdn的张孝祥专栏(http://blog.csdn.net/zhangxiaoxiang/archive/2006/08/15/1066757.aspx)上看到张老师出的一道题目,说是会让98%的Java程序员犯难的偏门问题!!
    当然,实际上哪有那么夸张,张老师也太低估搞java的了,而且这道题目怎么看我都好象在TIJ中看到过。。。但题目中还是有些细节值得学习学习地。。。

问题:

public class Parent 

    
public void test() 
    
{
    }

 
    
public Parent() 
    
{
        test();
    }

  
    
public static void main(String[] args) 
    
{
        
new Child();
    }

}

 
class Child extends Parent 
{
    
private int instanceValue = 20;
    
public void test() 
    
{
        System.out.println(
"instance value is: " + instanceValue);
    }

}



    各位先猜猜打印的结果是多少呢?为什么呢?
    在下面的回复中,我认为这种答案应该是正确的:
当实例化Child时(new Child()), 
会调用父类(Parent)的Constructor(构造函数). 
而在Parent的constructor中又调用的test()方法, 
此方法被子类Child Override了,所以那时会调用 
子类的test()方法,而调用的时候,子类的实例化 
还没有结束,其instance variable instanceValue还没有被赋值 
为20,而int 类型的默认值为0。 
因此打印的结果应该是0,而不是20。

    这题目确实不难,但有两点引起我的思考:
    (1)我在做这题目的时候,在new Child()时居然错误地认为,会先去调用Child类默认的构造函数,而实际上是:当创建派生类的对象时,系统将会调用基类的构造函数和派生类的构造函数,构造函数的执行次序是:先执行基类的构造函数,再执行派生类的构造函数。如果派生类又有对象成员,则,先执行基类的构造函数,再执行成员对象类的构造函数,最后执行派生类的构造函数。
    (2)instanceValue 这个变量是不会被赋值20的,但如果题目改为  private static int instanceValue = 20;那答案就应该是20了,因为在编译前就会赋20给这个变量。

    当然,还是等张老师公布正确答案吧,拭目以待。。。
原创粉丝点击