派生嵌套 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_LISTInnerA的静态块中只添加了一个元素,它只有1个元素。

实际上,您的代码从未使用 class InnerB。 JVM 不加载它,所以它的静态块不被执行。