Think In Java(2)中有详细的解释,第四章静态数据的初始化
static初始化只有在必要的时候才会进行。如果不创建一个Table对象,而且永远都不引用Table.b1或Table.b2,那么static Bowl b1和b2永远都不会创建。然而,只有在创建了第一个Table对象之后(或者发生了第一次static访问),它们才会创建。在那以后,static对象不会重新初始化。
初始化的顺序是首先static(如果它们尚未由前一次对象创建过程初始化),接着是非static对象。大家可从输出结果中找到相应的证据。

解决方案 »

  1.   

    Egg2 e2 = new BigEgg2();第一句的初始化
    先会以Egg2来初始化e2,在栈中记录的型别也是Egg2
    而Egg2中有成员变量的初始化,故先初始化Yolk
    private Yolk y = new Yolk();
    然后调用构造函数
    public Egg2() { System.out.println("New Egg2()"); }
    之后初始化动态型别BigEgg2
    调用构造函数
    public BigEgg2() { insertYolk(new Yolk()); }
    其实中会新建Yolk 
    而BigEgg2中的Yolk 是继承了Egg2中的Yolk
    故先构造public Yolk()
    { System.out.println("Egg2.Yolk()"); }
    再构造public Yolk()
    { System.out.println("BigEgg2.Yolk()"); }
    最后调用e2.g();是父类的函数,但insertYolk(new Yolk()); 将y的动态型别设成了BigEgg2.Yolk
    故调用的是public void f() {
    System.out.println("BigEgg2.Yolk.f()");这样的思路关键是继承中构造函数调用的次序要搞清楚。
      

  2.   

    回复人: shuneng() ( ) 信誉:100 
    已经解析的很清楚了
      

  3.   

    我还以为是什么呢,其实就是,构造函数的调用问题,,
    shuneng() ( ) 信誉:100 说得的已经很清楚了
      

  4.   

    Egg2 e2 = new BigEgg2();第一句的初始化
    先会以Egg2来初始化e2,在栈中记录的型别也是Egg2怎么不是先生成一个BigEgg2对象呢???明明是new BigEgg2()
      

  5.   

    《THINKING IN JAVA》多好的书啊
    再来个JBUILD的单步执行感性认识,哈哈
      

  6.   

    哈哈 这个我在考SCJP的时候就有好多这样的题目啊
    有个网上的总结讲的也很好啊
      

  7.   

    Egg2 e2 = new BigEgg2();第一句的初始化
    先会以Egg2来初始化e2,在栈中记录的型别也是Egg2怎么不是先生成一个BigEgg2对象呢???明明是new BigEgg2()期待解答!!!!!!
      

  8.   

    Egg2 e2 = new BigEgg2();第一句的初始化
    先会以Egg2来初始化e2,在栈中记录的型别也是Egg2怎么不是先生成一个BigEgg2对象呢???明明是new BigEgg2()期待解答!!!!!!
    ____________________________________他怎么不是在生成BigEgg2实例呢,不过他也是Egg2的实例呀,
    当然可以把这个句柄给这个变量了,如果你连上面的都还不明白的话,说明你还不真正了解什么是面向对象,什么叫继承
      

  9.   

    转贴
    对于初始化主要包含这几方面:static 变量 、non-static变量、构造函数、new对象建立。1、static 变量的初始化:当pulic class 被loadin(栽入)的时候,就开始对static变量初始化了,因为static 变量的refrence是存储在static storage(静态存储空间)中。此时不对non-static变量和构造函数初始化,因为还没有对象的产生,只是把某个型别loadin。注意对于static变量只初始化1次,当有新的对象产生时,他并不会重新被初始化了,也就是他的refrence已经固定,但他的值是可以改变的。2、当有对象产生时,开始对此class(型别)内的non-static变量进行初始化,然后再初始化构造函数。产生已初始化的object对象。3、按要求顺序执行其它函数。4、对有继承的class(型别)来说:derivedclass2、derivedclass1、baseclass;因为他们之间的继承关系,所以要想laodin derivedclass2,必须先loadin derivedclass1,如果想laodin derivedclass1,则先loadin baseclass。也就是说,laodin 顺序为:baseclass、derivedclass1、deriveclass2……,每当loadin 一个class时,则按“第一条”进行初始化(初始化该class内的static变量)。5、对有继承的class 当用new产生对象时,会按baseclass、derivedclass1、deriveclass2……的顺序,每个class内再按“第二条”进行初始化。注意derived class 的构造函数,一定要满足baseclss可初始化。总体思想:static变量……non-static变量……构造函数。