请教JAVA高手赐教小弟下例代码

来源:百度知道 编辑:UC知道 时间:2024/06/04 15:51:47
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(); }
}

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()

问题1: 为什么会输出两个

Egg2 e2 = new BigEgg2();
BigEgg2类继承Egg2类,程序分析:
1,首先初始化父类公有变量:private Yolk y = new Yolk(); 调用该类构造函数,输出: Egg2.Yolk()
2,调用父类构造函数,输出: NewEgg2()
3,调用父类内部类构造函数,输出: Egg2.Yolk()
4,然后调用自身构造函数,因构造函数内(调用父类方法)实例化了一个内部类对象,所以调用该内部类构造方法,输出: BigEgg2.Yolk()
5,e2.g()调用父类方法。综合第4部:y对象实际指向的是子类内部类对象,调用子类f()方法,输出:EigEgg2.Yolk.f()