梳理一下Java中类的加载顺序~
//父类
public class Father {
static {
System.out.println("父类静态代码块...");
}
{
System.out.println("父类构造代码块...");
}
public Father() {
System.out.println("父类构造函数...");
}
public void run() {
System.out.println("父类方法...");
}
}
//子类
public class Son extends Father {
public static int a = 1;
static {
a = 2;
System.out.println("子类静态代码块...");
}
public String name;
public Son(String name) {
System.out.println("子类构造函数...");
this.name = name;
}
{
a = 3;
System.out.println("子类构造代码块...");
}
@Override
public void run() {
System.out.println("子类复写父类方法: " + a);
}
public static void main(String[] args) {
Father father = new Son("java boy");
father.run();
new Son("java boy");
}
}
打印结果:
父类静态代码块...
子类静态代码块...
父类构造代码块...
父类构造函数...
子类构造代码块...
子类构造函数...
子类复写父类方法: 3
父类构造代码块...
父类构造函数...
子类构造代码块...
子类构造函数...
结论:
1. 父类先于子类进行初始化;
2. 静态代码块随着类的加载而加载,且只执行一次;
3. 构造代码块先于构造函数执行,两者每new一次就执行一次;
4. 从以上3点可以得出执行顺序:父类静态代码块->子类静态代码块->父类构造代码块->父类构造函数->子类构造代码块->子类构造函数。