派生嵌套 class 中的静态初始化程序块
Static initializer block in derived nested class
假设以下示例:
public abstract class A {
public void readList() {
for (Integer o : InnerA.INT_LIST) {
System.out.println(o);
}
}
public static class InnerA {
protected static List<Integer> INT_LIST;
static {
INT_LIST = new ArrayList<Integer>();
INT_LIST.add(1);
}
}
}
public class B extends A {
public static class InnerB extends InnerA {
static {
INT_LIST.add(2);
}
}
}
我的假设是,当我调用
new B().readList();
输出将是
1
2
而是
1
添加构造函数
public B() {
new InnerB();
}
导致预期的行为。我认为由于嵌套 class 是静态的,因此在创建新的 B 对象时对其进行初始化(显然是在初始化 A 时)。
谁能给我解释一下吗?
谢谢。
先看看readList()
的实现:
public void readList() {
for (Integer o : InnerA.INT_LIST) {
System.out.println(o);
}
}
很明显,它打印了InnerA
中的所有元素。
Class B 扩展了 Class A 并且不覆盖 readList()
函数。所以 new B().readList()
的行为也是打印 InnerA
中的所有元素。
由于InnerA.INT_LIST
在InnerA
的静态块中只添加了一个元素,它只有1个元素。
实际上,您的代码从未使用 class InnerB
。 JVM 不加载它,所以它的静态块不被执行。
假设以下示例:
public abstract class A {
public void readList() {
for (Integer o : InnerA.INT_LIST) {
System.out.println(o);
}
}
public static class InnerA {
protected static List<Integer> INT_LIST;
static {
INT_LIST = new ArrayList<Integer>();
INT_LIST.add(1);
}
}
}
public class B extends A {
public static class InnerB extends InnerA {
static {
INT_LIST.add(2);
}
}
}
我的假设是,当我调用
new B().readList();
输出将是
1
2
而是
1
添加构造函数
public B() {
new InnerB();
}
导致预期的行为。我认为由于嵌套 class 是静态的,因此在创建新的 B 对象时对其进行初始化(显然是在初始化 A 时)。
谁能给我解释一下吗?
谢谢。
先看看readList()
的实现:
public void readList() {
for (Integer o : InnerA.INT_LIST) {
System.out.println(o);
}
}
很明显,它打印了InnerA
中的所有元素。
Class B 扩展了 Class A 并且不覆盖 readList()
函数。所以 new B().readList()
的行为也是打印 InnerA
中的所有元素。
由于InnerA.INT_LIST
在InnerA
的静态块中只添加了一个元素,它只有1个元素。
实际上,您的代码从未使用 class InnerB
。 JVM 不加载它,所以它的静态块不被执行。