Java子类构造的完整执行顺序
package test;
public class Test {
public static void main(String[] args) {
new Son();
}
public static void print(String msg) {
System.out.println(msg);
}
public static int getInt(String name) {
print("static member " + name);
return 0;
}
public static String getString(String name) {
print("nonstatic member " + name);
return "";
}
static class Parent {
Parent() {
print("constructor parent");
}
static {
print("static block parent");
}
{
print("nonstatic block parent");
}
String str = getString("parent");
static int i = getInt("parent");
}
static class Son extends Parent {
Son() {
print("constructor son");
}
static {
print("static block son");
}
{
print("nonstatic block son");
}
String str = getString("son");
static int i = getInt("son");
}
}
最后输出结果为:
static block parent
static member parent
static block son
static member son
nonstatic block parent
nonstatic member parent
constructor parent
nonstatic block son
nonstatic member son
constructor son
这个说明了Java类的执行顺序为:
父类的静态块--->父类的静态成员--->子类的静态块--->子类的静态成员--->父类的非静态块--->父类的非静态成员--->
父类的构造函数--->子类的非静态块--->子类的非静态成员--->子类的构造函数