【发布时间】:2015-09-15 01:21:09
【问题描述】:
我知道静态块是在加载类时初始化的,因为类在程序中只加载一次,所以它们只初始化一次。
每次创建类的实例时都会初始化 IIB(实例初始化块),构造函数也是如此:它们在对象创建期间执行。
我不明白为什么在下面的程序中 IIB 在构造函数之前执行。 代码-
public class Hello {
public static void main(String args[]) {
C obj = new C();
}
}
class A {
static {
System.out.println("Inside static block of A");
}
{
System.out.println("Inside IIB of A");
}
A() {
System.out.println("Inside NO-ARGS constructor of A");
}
}
class B extends A {
static {
System.out.println("Inside static block of B");
}
{
System.out.println("Inside IIB of B");
}
B() {
System.out.println("Inside NO-ARGS constructor of B");
}
}
class C extends B {
static {
System.out.println("Inside static block of C");
}
{
System.out.println("Inside IIB of C");
}
C() {
System.out.println("Inside NO-ARGS constructor of C");
}
}
与构造函数相比,为什么首先执行 IIB?
【问题讨论】:
-
实际上是先调用构造函数,但是你的
sysout是在初始化块之后执行的,初始化块是编译器作为第一条语句(super()之后)插入的。 docs.oracle.com/javase/tutorial/java/javaOO/initial.html
标签: java constructor initialization