package com.dfy.callback;
public class Egg2 {
protected class York{
public York(){
System.out.println("egg2.rolk()");
}
public void f(){
System.out.println("egg2.yolk.f()");
}
}
private York y = new York();
public Egg2(){
System.out.println("new egg2()");
}
public void insertYork(York yy){
y = yy;
}
public void g(){
y.f();
}
}
class BigEgg2 extends Egg2{
//此处虽然也叫York,但是不同类中的内部类时相对独立的,只是名称相同,
//名称在此处并没有任何意义
class York extends Egg2.York{
public York() {
System.out.println("bigegg2.yolk");
}
//覆盖父类方法
public void f(){
System.out.println("bigegg2.york.f()");
}
}
BigEgg2(){
insertYork(new York());
}
public static void main(String[] args) {
Egg2 e2 = new BigEgg2();
e2.g();
}
}
输出结果
egg2.rolk()
new egg2()
egg2.rolk()
bigegg2.yolk
bigegg2.york.f()
执行顺序:
首先 new BigEgg2()执行父类方法中成员变量private York y = new York();时会去执行
York内部类的构造方法,输出第一行; 然后,执行父类Egg2 的构造方法,输出第二行; 然后,执行BigEgg2 自身构造方法时,执行insertYork(new York());实例化父类Egg2.York,
执行父类Egg2.York构造方法,输出第三行; 然后,执行York构造方法,输出第四行;
最后,执行e2.g();动态绑定到子类f()里,输出第五行。