初始化顺序如下:
- 父类静态变量初始化和静态代码块执行
- 子类静态变量初始化和静态代码块执行
- 父类普通变量初始化和普通代码块执行
- 父类构造方法执行
- 子类普通变量初始化和普通代码块执行
- 子类构造方法执行
昨天didi笔试的一道选择题(改了一下):
public class ObjectCore {
public static void main(String[] args) {
A b = new B();
}
}
class A {
private String name = "A";
public A() {
say();
}
public void say() {
System.out.println(name);
}
}
class B extends A {
private String name = "B";
public B() {
say();
}
public void say() {
System.out.println(name);
}
}
输出结果:
null
B
分析:
执行 A b = new B(); 这条语句:
- 由于A 是B的父类,所以按顺序初始化,应该先执行 A 的普通变量初始化,则A中的name为"A"
- 执行A的构造方法,调用say(),根据动态绑定,执行B中的say,但是此时B中的name还没有进行初始化,即还是null,所以B的say方法输出 null
- 执行B中name的初始化,则name = "B"
- 执行B的构造方法,则调用say,输出 B
以后碰到这样的题,只要严格按照顺序分析,就很容易得出答案啦~