最近在看《Thinking in Java》,看到一个关于内部类的例子,详细如下:
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();
}
}
public 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()
*/
通过这个例子,很好的复习了关于类初始化的过程,下面对其调用顺序做简要标注:
简要说明:
0、程序入口,初始化BigEgg2;
1、初始化BigEgg2的父类Egg2;
2、初始化类Egg2中的实例变量Yolk;
3、执行Egg2.Yolk的构造函数;
4、执行Egg2的构造函数;
5、返回并调用BigEgg2中的构造函数;
6、创建BigEgg2.Yolk的实例;
7、初始化BigEgg2.Yolk的父类Egg2.Yolk;
8、执行Egg2.Yolk的构造函数;
9、执行BigEgg2.Yolk的构造函数;
10、执行insertYokl函数,做对应的处理;
11、执行e2.g函数;
12、执行y.f函数;
13、执行f函数(覆盖了父类中的该方法)内容;