JAVA对象创建代码调用顺序
JAVA中初始化对象有多种方法:静态代码块、数据直接初始化、非静态代码块、构造器等。JVM创建一个新的对象有一个调用顺序。
看如下代码:
//Father类
public class Father {
String A = "这是Father的数据初始化";
{
System.out.println(A);
System.out.println("这是Father非静态块");
}
static{
System.out.println("这是Father静态块");
}
public Father(){
System.out.println("这是Father的构造器");
}
}
//Son类继承Father
public class Son extends Father{
static String B = "这是Son的静态数据初始化";
String C = "这是Son的数据初始化";
{
System.out.println("这是Son非静态块");
}
static{
System.out.println(B);
System.out.println("这是Son静态块");
}
public Son(){
System.out.println("这是Son的构造器");
}
}
//主函数创建类
public class Main {
public static void main(String args[]){
Son aSon = new Son();
}
}
输出结果如下:
这是Father静态块
这是Son的静态数据初始化
这是Son静态块
这是Father的数据初始化
这是Father非静态块
这是Father的构造器
这是Son非静态块
这是Son的构造器
可以得出结论,代码调用顺序为:
- 先父后子,所有静态块先加载;
- 在相应静态/非静态初始化中按照顺序:数据初始化->代码块(static/nonstatic)->构造器(nonstatic)。