派生嵌套类中的静态初始化程序块

时间:2015-03-18 10:45:25

标签: java inheritance inner-classes

假设以下示例:

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时)。

有人可以向我解释一下吗?

感谢。

1 个答案:

答案 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不加载它,因此不执行其静态块。