不好意思,"private static Test monitor = new Test();" 这一句忘记删除了。请还要考虑这一句。

解决方案 »

  1.   

    inner class 首先要初始化!
    同时inner class 之间的继承 的初始化顺序和其他没有inner class一样!!
      

  2.   

    e2.g();->y.f(); ->y = new Yolk();
    ->public Yolk() { System.out.println("Egg2.Yolk()"); }你看明白了吗,因为你在 y.f()的时候用到了 y=new Yolk() 实例化了Yolk ,而Yolk的构造函数有 System.out.println("Egg2.Yolk()");
    所以就有第一行打印出来了。
      

  3.   

    e2.g() ->y.f() ->y = new Yolk() ->public Yolk() { System.out.println("Egg2.Yolk()"); }看明白了吗, y = new Yolk();是实例化 Yolk,因为 Yolk构造函数里面有 System.out.println("Egg2.Yolk()"); 
    所以就打印出来了, 初始化过程首先应从父类的成员变量开始。
      

  4.   

    to 52741:  其实你所说的,我之前也怎么想,但总不踏实。
     那inner class与普通变量是谁先初始化呢?
      

  5.   

    你都已经揭帖了。不知道你还能看到我的回复吗?
    其实这个程序应该这样理解!(当然普通变量是先初始化的,你应该跟踪一下看看程序的执行过程细节就明白多了)依此类推。想必你能懂了!!!
    还有一点声明,你可能误会了我第一次的帖子。我只是针对这个程序而言并不是说明内引类初始化在某个方法或者类之前的意思。如果语言没有表达清楚请你原谅!!!!代码:
    class Egg2 {                    +3+在这个类中首先初始化的是  private Yolk y = new Yolk();这句。由于new Yolk()所以找到内引类Yolk对其初始化找到它的构造函数打印了第一个数据 "Egg2.Yolk()",然后执行了Egg2类的构造函数打印了"New Egg2()",之后程序在回到+2+ BigEgg2类中找到构造函数,但是遇到new Yolk()。是它的内引类。所以又是由于内引类继承的关系重复了刚才的初始化原理(我就不多说了!)  protected class Yolk {
        public Yolk() { System.out.println("Egg2.Yolk()"); }
        public void f() { System.out.println("Egg2.Yolk.f()");}
      }
      private Yolk y = new Yolk();
      public Egg2() { System.out.println("New Egg2()"); }
      public void insertYolk(Yolk yy) { y = yy; }
      public void g() { y.f(); }
    }public class BigEgg2 extends Egg2 {                +2+ 这里,本应该对GigEgg2进行初始化处理,但是由于它extends Egg2,所以程序到+3+
      private static Test monitor = new Test();
      public class Yolk extends Egg2.Yolk {
        public Yolk() { System.out.println("BigEgg2.Yolk()"); }
        public void f() {
          System.out.println("BigEgg2.Yolk.f()");
        }
      }
      public BigEgg2() { insertYolk(new Yolk()); }
      public static void main(String[] args) {
        Egg2 e2 = new BigEgg2();         //+1+。程序首先从这里开始,由于new BigEgg2() 所以程序到---》2
        e2.g();
     }
    }