前言
在日常使用Java的时候,我们都接触过new这个关键字,那你是否知道在我们的对象真正创建出来之前都做了哪些事情呢?
实际上要去判断一个类的初始化的顺序,需要分一下情况,一种是没有继承关系的类(不考虑Object类),一种是有继承关系的类。
一、无继承关系类的初始化
原则 one
类的一个对象进行初始化,按照代码顺序从上往下先构建静态的属性、方法和静态块,之后在构建非静态块和非静态属性。(类中的静态块和静态变量只会初始化一次,也就是类第一次被用到的时候)
原则 two
一个类中有静态的本类对象,创建的过程从上到下先执行本类的非静态块和非静态属性,最后在执行构造方法。
二、有父类继承的初始化
三、 代码测试
子类
public class InitializeDemo extends InitializeDemoFather{
private static int k = 1;
private static InitializeDemo t1 = new InitializeDemo("t1");
private static InitializeDemo t2 = new InitializeDemo("t2");
private static int i = print("i");
private static int n = 99;
{
print("初始化块");
j=100;
}
public InitializeDemo(String str){
System.out.println((k++)+":" + str + " i="+i+". n="+n);
++i;
++n;
}
static{
print("静态块");
n=100;
}
private int j = print("j");
public static int print(String str){
System.out.println((k++)+":" + str + " i="+i+". n="+n);
++n;
return ++i;
}
public static void main(String[] args) {
InitializeDemo i = new InitializeDemo("test");
}
}
父类
{
System.out.println("父类初始化块");
}
static{
System.out.println("父类静态块");
}
public InitializeDemoFather(){
System.out.println("父类构造函数");
}
}
总结
大家可以手动执行下代码做分析,如果疑惑可评论区讨论。