你这要从程序运行的过程看,先是CLASS装入,然后变量初始化,然后执行构造方法
所以,它先执行“ private Yolk y = new Yolk();”的初始化。
然后执行BigEgg2()
BigEgg2()调用父类的Egg2()构造方法,然后再执行自己的“insertYolk(new Yolk()); ”此时又new 一个Yolk对象,就是调用Yolk的构造方法,这是BigEgg2.Yolk(),它先调用Egg2.Yolk()的构造方法,所以打印Egg2.Yolk(),然后再执行自己的“System.out.println("BigEgg2.Yolk()");”,这时返回Yolk对象。把刚刚创建的Egg2.Yolk对象y的句柄指向一个BigEgg2.Yolk对象。
最后执行BigEgg2.Yolk.f(),这是重写的方法,所以打印BigEgg2.Yolk.f()

解决方案 »

  1.   

    所以,程序执行过程是先
             1、class装入时class变量装入
             (省去CODE验证什么什么的····)
             2、成员变量初始化
             3、成员变量赋初值
             4、执行构造方法
      构造方法执行中如没有super和this,总是先执行父类的super()
      

  2.   

    厉害!谢谢dt(锈芯箭)的指点,还有一些不明白的:“把刚刚创建的Egg2.Yolk对象y的句柄指向一个BigEgg2.Yolk对象。”到底什么的句柄指向什么?