下面的代码非常简单,一时想不通的地方是,输出的结果:我觉得输出结果是
New Egg2()
Egg2.Yolk()
BigEgg2.Yolk()
BigEgg2.Yolk.f()
为什么下面的输出,会先输出个Egg2.Yolk()??

import static net.mindview.util.Print.*;class Egg2 {
  protected class Yolk {
    public Yolk() { print("Egg2.Yolk()"); }
    public void f() { print("Egg2.Yolk.f()");}
  }
  private Yolk y = new Yolk();
  public Egg2() { print("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() { print("BigEgg2.Yolk()"); }
    public void f() { print("BigEgg2.Yolk.f()"); }
  }
  public BigEgg2() { insertYolk(new Yolk()); }
  public static void main(String[] args) {
    Egg2 e2 = new BigEgg2();
    e2.g();
  }
} /* Output:
Egg2.Yolk()
New Egg2()
Egg2.Yolk()
BigEgg2.Yolk()
BigEgg2.Yolk.f()
*///:~

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【llm0528】截止到2008-07-29 22:23:30的历史汇总数据(不包括此帖):
    发帖的总数量:66                       发帖的总分数:1450                     每贴平均分数:21                       
    回帖的总数量:60                       得分贴总数量:0                        回帖的得分率:0%                       
    结贴的总数量:66                       结贴的总分数:1450                     
    无满意结贴数:0                        无满意结贴分:0                        
    未结的帖子数:0                        未结的总分数:0                        
    结贴的百分比:100.00%               结分的百分比:100.00%                  
    无满意结贴率:0.00  %               无满意结分率:0.00  %                  
    敬礼!

    取消马甲机器人,请点这里:http://www.java2000.net/mycsdn/robotStop.jsp?usern=llm0528
      

  2.   

    public BigEgg2() { insertYolk(new Yolk()); }这里新建了一个Yolk吧
      

  3.   

    public Yolk() { print("Egg2.Yolk()"); }
    你把这里的print("Egg2.Yolk()");去掉就和你想要的一样了
      

  4.   

    private Yolk y = new Yolk();
    先初始化属性
      

  5.   

    输出是:
    Egg2.Yolk()
    New Egg2()
    Egg2.Yolk()
    BigEgg2.Yolk()
    BigEgg2.Yolk.f()
    看这句:
    Egg2 e2 = new BigEgg2();
    要创建BigEgg2的对象,构造该构造方法之前需要先调用其父类的构造方法Egg2 e2 = new BigEgg2();
    在调用父类的构造方法之前父类中有一个变量需要初始化: private Yolk y = new Yolk();这时需要调用York的构造方法,public Yolk() { print("Egg2.Yolk()"); },所以首先输出Egg2.Yolk()
    然后调用父类的构造方法,输出New Egg2(),然后调用子类的构造方法public BigEgg2() { insertYolk(new Yolk()); }
    进入该方法,看new Yolk(),先调用Yolk父类的构造方法,public Yolk() { print("Egg2.Yolk()"); },输出Egg2.Yolk(),然后调用子类的构造方法
    public Yolk() { print("BigEgg2.Yolk()"); },输出BigEgg2.Yolk(),这样才完成了对象的创建.
    下面执行
      e2.g();
    多态,输出BigEgg2.Yolk.f()
    结束
      

  6.   

    关键是这句:
    private Yolk y = new Yolk();
    在构造方法之前执行.
      

  7.   


    private Yolk y = new Yolk();实例化对象的同时首先会先调用构造方法,然后执行其他。
      

  8.   

    在main()函数中Egg2 e2 = new BigEgg2(),而BigEgg2类extends类EEg2,在主函数中实例化e2用的BigEgg2的构造方法,BigEgg2是Egg2的子类,实例化它必须先实例化它的父类,必须先调用父类也就是EEg2的构造方法,所以先输出Egg2.Yolk()!