首先,先说结论。静态常量的初始化与静态代码块的执行优先级一样,谁在前边就先执行谁。
A类是B类的父类。都存在构造方法,静态代码块,静态常量,普通代码块。
记住口诀,先父后子,静态优先,构造最后。
父类的静态代码块/父类的静态常量(讲顺序)>子类的静态代码块/子类的静态常量初始化(讲顺序)>父类的普通代码块>父类的构造器>子类的普通代码块>子类的构造器。
这个顺序,下边编写一个Java代码来验证。
/**
* @Author 胡川
* @Date 2021年07月16日 19:42
*/
public class User {
public static String address = "luzhou";
static{
targer = 15;
System.out.println("父类静态代码块执行");
}
public User() {
System.out.println("父类构造方法执行");
}
public void fun1(){
System.out.println("fun1().....");
}
{
System.out.println("父类普通代码块执行");
}
static int targer=5;
}
class Son extends User{
private String name;
@Override
public void fun1() {
System.out.println("子类fun1()");
}
static {
System.out.println("子类静态代码块执行");
}
{
System.out.println("子类普通代码块执行");
}
public static String address = "四川";
public Son() {
System.out.println("子类构造方法执行");
}
}
class Test1{
public static void main(String[] args) {
User user = new Son();
}
}
运行截图:
判断静态代码块和静态常量的初始化我用的DEBUG调试。