Java类实例化顺序总结
程序员文章站
2022-05-23 17:33:36
...
直接上一段代码:
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步会在每次实例化对象时都执行。
上一篇: 扩展实例对象访问内部属性问题
下一篇: 2019年3月29日:Java代码记录