执行顺序为
- 父类静态初始化块和父类静态成员变量
- 子类静态初始化块和子类静态成员变量
- 父类初始化块和父类成员变量
- 父类构造方法
- 子类初始化块和子类成员变量
- 子类构造方法
创建一个父类
public class SuperInitial {
private int a = 1;
private static int b = 2;
public SuperInitial() {
System.out.println("super");
sayHello();
}
{
System.out.println("super block");
System.out.println("a:" + a);
sayHello();
}
static {
System.out.println("super static block");
System.out.println("b:" + b);
}
public void sayHello() {
System.out.println("super say hello!");
}
}
创建一个子类
public class Initial extends SuperInitial {
private int c = 3;
private static int d = 4;
public Initial() {
System.out.println("initial");
sayHello();
}
{
System.out.println("initial block");
System.out.println("c:" + c);
}
static {
System.out.println("initial static block");
System.out.println("d:" + d);
}
@Override
public void sayHello() {
System.out.println("say hello!, " + this.c);
}
}
打印结果如下
super static block
b:2
initial static block
d:4
super block
a:1
say hello!, 0
super
say hello!, 0
initial block
c:3
initial
say hello!, 3
在父类中调用方法sayHello方法,该方法已被子类方法覆盖,此时子类变量已存在,默认初始化值