本帖最后由 freehiker 于 2013-11-26 13:03 编辑
我标记了一下执行顺序,先写上代码,然后我再一步步说明
- package test.java;
- class Egg
- {
- protected class Yolk{
- public Yolk(){
- System.out.println("Egg.Yolk()"); // -> 1-1:Egg.Yolk(); 2-1-1:Egg.Yolk();
- }
- public void f(){
- System.out.println("Egg.Yolk.f()");
- }
- }
- private Yolk y=new Yolk(); // -> 1-1
- public Egg(){
- System.out.println("New Egg()"); //->1-2.New Egg()
-
- }
- public void insertYolk(Yolk yy){
- y=yy;
- }
- public void g(){
- y.f();
- }
- }
- public class BigEgg extends Egg{
- public class Yolk extends Egg.Yolk{
- public Yolk(){
- //super(); -> 2-1
- System.out.println("BigEgg.Yolk()"); // 2-1-2:BigEgg.Yolk();
- }
- public void f(){
- System.out.println("BigEgg.f()"); // 3-1:BigEgg.f 因为Egg.Yolk下的f方法被覆盖
- }
- }
- public BigEgg(){
- //super(); -> 1
- insertYolk(new Yolk()); // -> 2
- }
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- Egg e=new BigEgg();
- e.g(); //-> 3
- }
- }
复制代码
/*
* 1.创建BigEgg()对象,BigEgg()的构造函数中隐含super(),所以会执行Egg()的构造代码,即先初始化Egg对象
* 2.初始化Egg对象时,先要初始化成员变量,即Yolk y=new Yolk();所以这时候就会输出"Egg.Yolk()"
* 3.接着通过Egg构造函数继续初始化Egg对象,这时就输出了"New Egg()";
* 4.执行insertYolk(new Yolk());语句,这里要初始化BigEgg.Yolk对象
* 5.和上面同样的道理,输出了父类构造函数中的"Egg.Yolk()"字符串
* 6.继续执行System.out.println("BigEgg.Yolk()");输出了BigEgg.Yolk()字符串
* 7.继续执行e.g(),因为BigEgg中没有g方法
* ,所以调用Egg中的g方法,此方法继续调用Egg.Yolk的f方法,因为Egg.Yolk的f方法被BiggEgg
* .Yolk的f方法覆盖,所以输出BigEgg.f()字符串
*/
|