假设以下示例:
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();
}
导致预期的行为。我认为既然嵌套类是静态的,它会在创建一个新的B对象时被初始化(显然是在初始化A时)。
有人可以向我解释一下吗?
感谢。
答案 0 :(得分:1)
让我们先看看readList()
的实施情况:
public void readList() {
for (Integer o : InnerA.INT_LIST) {
System.out.println(o);
}
}
很明显,它会打印InnerA
中的所有元素
B类扩展了A类,并没有覆盖readList()
函数。因此,new B().readList()
的行为也会打印InnerA
中的所有元素。
由于InnerA.INT_LIST
只在InnerA
的静态块中添加了元素,因此它只有1个元素。
实际上,您的代码从不使用类InnerB
。 JVM不加载它,因此不执行其静态块。