版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hqqqqqqq555/article/details/85766725
直接上一段代码:
public class LoadOrder {
public static void main(String[] args) {
Son son = new Son();
System.out.println("&&&&&&&&&&&&&&&&&&&&&&&");
Son son1 = new Son();
}
}
class GrandFather {
private static String GrandFatherStaticField = getGrandFatherStaticField();
private String GrandFatherNonStaticField = getGrandFatherNonStaticField();
static {
System.out.println("爷爷的静态代码块");
}
{
System.out.println("爷爷的非静态代码块");
}
public GrandFather() {
System.out.println("爷爷的构造函数");
}
static String getGrandFatherStaticField() {
System.out.println("爷爷的静态字段");
return "GrandFatherStaticField";
}
static String getGrandFatherNonStaticField() {
System.out.println("爷爷的非静态字段");
return "GrandFatherNonStaticField";
}
}
class Father extends GrandFather {
private static String FatherStaticField = getFatherStaticField();
private String FatherNonStaticField = getFatherNonStaticField();
static {
System.out.println("爸爸的静态代码快");
}
{
System.out.println("爸爸的非静态代码快");
}
public Father() {
System.out.println("爸爸的构造函数");
}
static String getFatherStaticField() {
System.out.println("爸爸的静态字段");
return "FatherStaticField";
}
static String getFatherNonStaticField() {
System.out.println("爸爸的非静态字段");
return "FatherNonStaticField";
}
}
class Son extends Father {
private static String SonStaticField = getSonStaticField();
private String SonNonStaticField = getSonNonStaticField();
static {
System.out.println("儿子的静态代码块");
}
{
System.out.println("儿子的非静态代码块");
}
public Son() {
System.out.println("儿子的构造方法");
}
static String getSonStaticField() {
System.out.println("儿子的静态字段");
return "SonStaticField";
}
static String getSonNonStaticField() {
System.out.println("儿子的非静态字段");
return "SonNonStaticField";
}
}
执行结果:
爷爷的静态字段
爷爷的静态代码块
爸爸的静态字段
爸爸的静态代码快
儿子的静态字段
儿子的静态代码块
爷爷的非静态字段
爷爷的非静态代码块
爷爷的构造函数
爸爸的非静态字段
爸爸的非静态代码快
爸爸的构造函数
儿子的非静态字段
儿子的非静态代码块
儿子的构造方法
&&&&&&&&&&&&&&&&&&&&&&&
爷爷的非静态字段
爷爷的非静态代码块
爷爷的构造函数
爸爸的非静态字段
爸爸的非静态代码快
爸爸的构造函数
儿子的非静态字段
儿子的非静态代码块
儿子的构造方法
可以看到执行顺序是:
- 父类静态字段 => 父类静态代码块 => 子类静态字段 => 子类静态代码块 =>
- 父类字段 => 父类代码块 =>父类构造方法 => 子类字段 => 子类代码块 =>子类构造方法
其中第1步只会执行1次,第2步会在每次实例化对象时都执行。
注意:静态字段和静态代码块的执行顺序是根据代码顺序来的,如果静态代码块在静态字段之前,就先执行静态代码块。