class Egg2
{
class Yolk
{
public Yolk()
{
System.out.println("Yolk InnerClass : Yolk()");
}
public void f()
{
System.out.println("Yolk InnerClass Method : f()");
}
}
private Yolk y=new Yolk();
public Egg2()
{
System.out.println("Egg2 OuterClass : Egg2()");
}
public void insertYolk(Yolk y)
{
this.y=y;
}
public void g()
{
y.f();
}
}class BigEgg2 extends Egg2
{
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());
}
}class Test
{
public static void main(String[] args)
{
Egg2 e2=new BigEgg2();
e2.g();
}
}
上面代码的结果,我不理解,对它执行顺序也很糊涂。BigEgg2类是Egg2类的子类,new BigEgg2()时,应该先执行父类Egg2的构造方法,接着执行子类BigEgg2的构造方法。可是首先执行的是Egg2类的内部类Yolk的构造方法,我很糊涂,请大家帮忙解答一下!

解决方案 »

  1.   

    因为调用Egg2的构造方法之前,会先执行private Yolk y=new Yolk();这样就会先调用Yolk()了
    这里要注意一点,初始化块是在构造函数前执行的
    private Yolk y=new Yolk();相当于
    private Yolk y;
    {y=new Yolk();} //{}这样的处理叫做初始化块比如
    class A {
        {System.out.println("first");}    public A() {
            System.out.println("second");
        }    public static void main(String[] args) {
            A a = new A();
        }
    }
      

  2.   

    谢谢,又学习到了一些东西!还有个问题Egg2类中的内部类Yolk的构造方法,执行了两次。下面是结果:
    Yolk InnerClass : Yolk()
    Egg2 OuterClass : Egg2()
    Yolk InnerClass : Yolk()
    BigEgg2.Yolk()
    BigEgg2.Yolk.f()是什么原因,它执行了两次呢?
      

  3.   

    Java编程思想里面专门有一节讲初始化的,虽然那本书不怎么的,不过这点讲的蛮细的
      

  4.   

    Egg2类中的内部类Yolk的构造方法,执行了两次,这个问题,我明白了!
    insertYolk(new Yolk())将Yolk对象传给了Egg2类中的insertYolk方法的形参,形参又赋给了Yolk y,这是不是表示,在这时候y指向了BigEgg2的内部类啊?
      

  5.   

    谢谢3楼朋友的提示!谢谢qybao的解释,我已经明白了!还有你经常帮我解答问题,很感谢!