你这要从程序运行的过程看,先是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()
所以,它先执行“ 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、class装入时class变量装入
(省去CODE验证什么什么的····)
2、成员变量初始化
3、成员变量赋初值
4、执行构造方法
构造方法执行中如没有super和this,总是先执行父类的super()