这里先把整理好的结论抛给大家,然后来验证我们的结论
在Java类被new的过程中,执行顺序如下:
在实现继承的类被new的过程中,初始化执行顺序如下:
这里需要简单的介绍一下静态代码块和非静态代码块。 1. 静态代码块:
static { }
2. 非静态代码块
{ }
静态代码块和非静态代码块的异同点如下:
对于结论的最好验证就是写出代码来进行结果证明。
首先,来看一下无继承的类初始化时的执行顺序,代码如下:
public class Test {
public static String STATIC_FIELD = "静态属性";
// 静态块
static {
System.out.println(STATIC_FIELD);
System.out.println("静态代码块");
}
public String field = "非静态属性";
// 非静态块
{
System.out.println(field);
System.out.println("非静态代码块");
}
public Test() {
System.out.println("无参构造函数");
}
public static void main(String[] args) {
Test test = new Test();
}
}
执行结果:
当Java类实现继承后,执行顺序是否和我们的结论吻合。测试代码如下:
class ParentTest {
public static String PARENT_STATIC_FIELD = "父类-静态属性";
// 父类-静态块
static {
System.out.println(PARENT_STATIC_FIELD);
System.out.println("父类-静态代码块");
}
public static String parentField = "父类-非静态属性";
// 父类-非静态块
{
System.out.println(parentField);
System.out.println("父类-非静态代码块");
}
public ParentTest() {
System.out.println("父类—无参构造函数");
}
}
public class Test extends ParentTest {
public static String STATIC_FIELD = "静态属性";
// 静态块
static {
System.out.println(STATIC_FIELD);
System.out.println("静态代码块");
}
public String field = "非静态属性";
// 非静态块
{
System.out.println(field);
System.out.println("非静态代码块");
}
public Test() {
System.out.println("无参构造函数");
}
public static void main(String[] args) {
Test test = new Test();
}
}
执行结果如下:
可以看到,静态代码块只在类加载时执行一次,在main方法之前执行。实例代码块在每次创建对象时执行,然后再执行构造方法。
注意,代码块的执行顺序是固定的,无论创建多少个对象,都会按照上述顺序执行。