1、静态优先,构造随后;
2、无论静态还是构造,先父再子
即: 父类静态代码块 ->子类静态代码块 ->父类非静态代码块 -> 父类构造函数 -> 子类非静态代码块 -> 子类构造函数
代码演示:
class Father {
static {
System.out.println("父类静态代码块");
}
{
System.out.println("父类非静态代码块");
}
public Father() {
System.out.println("父类构造函数");
}
}
public class Son extends Father {
static {
System.out.println("子类静态代码块");
}
{
System.out.println("子类非静态代码块");
}
public Son() {
System.out.println("子类构造函数");
}
public static void main(String[] args) {
Son son = new Son();
}
}
结果:
父类静态代码块
子类静态代码块
父类非静态代码块
父类构造函数
子类非静态代码块
子类构造函数
原理分析:
-
为什么静态优先,构造随后?
首先static修饰的成员变量和方法是从属于类的, 而普通变量和方法是从属于对象的,在调用某个类的构造方法之前,应该先加载类信息,包括静态初始化块!之后才能创建对象! -
为什么先父再子?
由于子类继承了父类,就拥有了父类的所有属性和方法(除了构造方法),但不一定可以直接访问(私有属性和方法) 子类去创建对象的时候,构造方法第一句总是:super(…)来调用父类对应的构造方法。