RT .. 代码如下.class Egg2
{
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
{
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();
e2.g();
}
}代码编译后执行结果:
Egg2.Yolk()
New Egg2()
Egg2.Yolk()
BigEgg2.Yolk()
BigEgg2.Yolk.f()但我对这个结果不解.按照我的理解,执行顺序应该如下才对:
首先mian方法,因为Egg2 e2 = new BigEgg2();所以调用BigEgg2类.
因为BigEgg2 extends Egg2,所以会调用Egg2类的构造函数.所以应该输出:New Egg2();
然后返回回来调用 BigEgg2类的构造函数,因为insertYolk(new Yolk());所以调用Yolk类,
因为Yolk extends Egg2.Yolk 所以调用Egg2类里的Yolk内部类的构造方法,所以应该输出:Egg2.Yolk()
返回来执行y = yy;
然后因为mian方法里的e2.g();所以调用Egg2类里的g()方法,因为y.f();所以应该输出BigEgg2.Yolk.f()所以我的执行结果是:
New Egg2()
Egg2.Yolk()
BigEgg2.Yolk.f()请问我是那里理解有错? 谢谢.

解决方案 »

  1.   

    Thinking in java 2 中所给的代码结果没有问题:
    执行顺序如下:
    (1)Egg2 e2 = new BigEgg2();
         由于BigEgg2 继承Egg2,因此在执行BigEgg2构造函数时,首先执行父类Egg2的成员变量初始化及构造函数的剩余部分;
         因此是 <1>private Yolk y = new Yolk();也就是System.out.println("BigEgg2.Yolk()");
                <2>System.out.println("New Egg2()");
    (2)<1>然后执行derived(衍生)类 BigEgg2 的 内部类 Yolk 的构造函数,又因为Yolk是继承自 Egg2的 Yolk,因此先执行 Egg2 的Yolk的构造函数,即System.out.println("Egg2.Yolk()");
    (3)最后执行e2.g();因此结果为:
    Egg2.Yolk()
    New Egg2()
    Egg2.Yolk()
    BigEgg2.Yolk()
    BigEgg2.Yolk.f()
      

  2.   

    因为BigEgg2 extends Egg2,所以会调用Egg2类的构造函数;所以
    private Yolk y = new Yolk();会执行.
      

  3.   

    改正:
    Thinking in java 2 中所给的代码结果没有问题:
    执行顺序如下:
    (1)Egg2 e2 = new BigEgg2();
         由于BigEgg2 继承Egg2,因此在执行BigEgg2构造函数时,首先执行父类Egg2的成员变量初始化及构造函数的剩余部分;
         因此是 <1>private Yolk y = new Yolk();也就是System.out.println("Egg2.Yolk()");
                <2>System.out.println("New Egg2()");
    (2)<1>然后执行derived(衍生)类 BigEgg2 的 内部类 Yolk 的构造函数,又因为Yolk是继承自 Egg2的 Yolk,因此先执行 Egg2 的Yolk的构造函数,即System.out.println("Egg2.Yolk()");然后执行BigEgg2 的内部类 Yolk 的构造函数,即System.out.println("BigEgg2.Yolk()");
    (3)最后执行e2.g();因此结果为:
    Egg2.Yolk()
    New Egg2()
    Egg2.Yolk()
    BigEgg2.Yolk()
    BigEgg2.Yolk.f()