【问题标题】:Static initializer block in derived nested class派生嵌套类中的静态初始化块
【发布时间】:2015-03-18 10:45:25
【问题描述】:

假设以下示例:

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

谁能给我解释一下?

谢谢。

【问题讨论】:

    标签: java inheritance inner-classes


    【解决方案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_LISTInnerA的静态块中只添加了一个元素,所以它只有1个元素。

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

    【讨论】:

    • 是的,正确,由于延迟加载,B 类永远不会加载。因此,静态初始化程序永远不会执行。
    • 好的,不知道这个延迟加载。所以我要么覆盖readList(),要么在B的构造函数中添加new InnerB()。谢谢EDIT覆盖readList()并遍历InnerB.INT_LIST也不起作用。唯一有效的是在 B 的构造函数中调用 new InnerB()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 2020-08-19
    • 1970-01-01
    相关资源
    最近更新 更多