[英]Order of execution for Java static blocks
我有2节课。 X类是Y类的父类。这两个类都有静态块。 我想知道静态块的执行顺序。
为什么 Block 3 在 Block 2 之前执行?
结果我得到:
Java代码:
class X{
static String a = "ABC";
static
{
a = a + "123";
System.out.println("Static Block 1");
}
{
a = "ABC123";
System.out.println("Static Block 2");
}
}
class Y extends X{
static
{
a = a + "123ABC";
System.out.println("Static Block 3");
}
{
System.out.println("Static Block 4");
System.out.println(a);
}
}
public class MainClass {
public static void main(String[] args) {
Y y = new Y();
}
}
static
修饰符仅适用于紧随其后的块。 这意味着块 1 和 3 是static
块,但块 2 和 4 是实例块,只有在实例化对象时才会调用。
考虑到这一点,执行顺序可以解释如下。
new Y()
从main
方法调用,因此类加载器尝试加载类Y
。Y
扩展了类X
,因此它尝试加载它。X
并执行其静态初始化程序(块 1)。Y
并执行其静态初始化程序(块 3)。Y
,因此首先调用X
的底层初始化,并执行块 3。Y
实例的初始化通过执行块4完成。静态块 1 静态块 2
实例块-1
实例块 2
0-arg构造函数
静态块-1
静态块 2 实例块 1
实例块 2
0-arg构造函数
0-arg method_1_
实例块-1
实例块 2
1-arg构造函数
1-arg 方法_2_
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.