最近有朋友问我基类和子类初始化顺序的问题,个人觉得听起来虽简单,但和容易混淆和遗忘,故整理分享一下。
一段代码足以说明一切:
class B {
B() {
print("B");
}
}
class D {
D() {
print("D");
}
}
class A {
// 静态代码块
static {
print("A-->static");
}
// 实例代码块
private D d = new D();
// 构造代码块
A() {
print("A");
}
}
class C extends A {
// 静态代码块
static {
print("C-->static");
}
// 实例代码块
private B b = new B();
// 构造代码块
C() {
print("C");
}
}
public class Test_5 {
public static void main(String[] args) {
// TODO Auto-generated method stub
C c = new C();
}
}
output:
A-->static
C-->static
D
A
B
C
看到输出之后,一切都很明了,那就是:
基类静态代码块 --> 子类静态代码块 --> 基类实例代码块 --> 基类构造代码块 --> 子类实例代码块 --> 子类构造代码块
就到这里,再见吧!