Java基础–类变量初始化顺序
以前总是碰到java类初始化的问题。今天自己跑了测试后,总结一下:
- 执行初始化父类的类变量和静态代码块(static block)。静态代码块和类变量初始化的执行顺序按照他们在代码中出现的持续排序
- 执行初始子类的类变量和静态代码块。和父类相同。
- 执行父类的构造函数(如果子类的构造函数没有显示调用super,则默认调用父类的无参构造函数。如果父类没有无参构造函数,则编译报错。)
- 初始化父类的实例变量:首先初始化,构造函数以外的实例变量,顺序按照在代码中出现的顺序相同。再初始化构造函数以内的实例变量,顺序和代码执行顺序相同。
- 执行子类的构造函数(super以后,如果显示调用的话)。
- 子类的实例变量初始化顺序和父类相同。
下面举例子:
package com.company;
class Dummy {
public Dummy(String s) {
System.out.println(s);
}
}
class SuperClass {
public static Dummy DUMMY = new Dummy("super DUMMY");
static {
System.out.println("Super static");
}
public Dummy aDummy = new Dummy("super aDummy");
public Dummy bDummy;
public SuperClass(String s) {
System.out.println("super construct: " + s);
cDummy = new Dummy("Super cDummy");
bDummy = new Dummy("Super bDummy");
}
public SuperClass() {
System.out.println("Super construct");
cDummy = new Dummy("Super cDummy");
bDummy = new Dummy("Super bDummy");
}
public Dummy cDummy = null;
public static Dummy dDummy = new Dummy("super dDummy");
public static Dummy eDummy;
static {
eDummy = new Dummy("super eDummy");
}
public static Dummy fDummy = new Dummy("super fDummy");
public Dummy gDummy = new Dummy("gDummy");
}
class SubClass extends SuperClass {
public static Dummy HDUMMY = new Dummy("hdummy");
Dummy iDummy = new Dummy("iDummy");
static Dummy jDummy = new Dummy("jDummy");
Dummy kDummy;
public SubClass(String s) {
super(s);
System.out.println();
kDummy = new Dummy("kDummy");
}
static Dummy lDummy = new Dummy("lDummy");
static Dummy mDummy;
static {
mDummy = new Dummy("mDummy");
nDummy = new Dummy("nDummy");
}
static Dummy nDummy;
static Dummy oDummy = new Dummy("oDummy");
}
public class Main {
public static void main(String[] args) {
SubClass subClass = new SubClass("hi");
}
}
输出为:
super DUMMY
Super static
super dDummy
super eDummy
super fDummy
hdummy
jDummy
lDummy
mDummy
nDummy
oDummy
super aDummy
gDummy
super construct: hi
Super cDummy
Super bDummy
iDummy
kDummy