【问题标题】:prevent inheritance of static block防止继承静态块
【发布时间】:2013-06-19 07:44:44
【问题描述】:

如果我们运行派生类,它将打印派生类和父类..有什么办法可以防止静态块的继承?

//第一类

public class parent {
static {
      System.out.println("Parent");
}
}

//类2

public class derived extends parent{
      static {
            System.out.println("derived");
      }

      public static void main(String [] args) {

      }
}

基本上,我在父类中有一些方法,我想继承但不希望在实例化派生类时发生父静态块中发生的处理。 .有什么办法可以做到这一点,否则我将不得不复制代码?

【问题讨论】:

  • “否”是答案。现在,一个问题:你为什么要这样做?
  • 似乎是糟糕的设计。是否可以将父级的静态代码重构到其构造函数中?
  • 你真的不希望静态初始化器做除了设置常量之外的任何事情。
  • @fge 代码是遗留代码,静态初始化器用于使用 DOMconfiguratgor.configure 配置记录器。由于它是一次性活动,我不能将其放入构造函数中。
  • 是的,你可以:创建一个单例!

标签: java inheritance java-6


【解决方案1】:

不行。你不能那样做。 静态初始化块不被继承。静态块在加载类时执行,因为您的基类扩展了超类,即使是超类定义也会在引用您的类时被 JVM 加载。

根据JLS 12.4.1

当初始化发生时 类或接口类型 T 将在以下任何一项第一次出现之前立即初始化:

• T 是一个类,并创建了一个 T 的实例。

• T 是一个类,并且调用了 T 声明的静态方法。

• 分配了一个由 T 声明的静态字段。

• 使用了由 T 声明的静态字段,并且该字段不是常量变量(第 4.12.4 节)。

• T 是一个顶级类(第 7.6 节),执行词法嵌套在 T(第 8.1.3 节)中的断言语句(第 14.10 节)。

【讨论】:

    【解决方案2】:

    这是不可能的。静态块在类加载期间执行,如果不将父类重构为不使用静态块,就无法防止这种情况发生

    【讨论】:

      猜你喜欢
      • 2014-10-08
      • 1970-01-01
      • 2020-05-27
      • 1970-01-01
      • 2013-12-20
      • 1970-01-01
      • 1970-01-01
      • 2012-05-28
      • 1970-01-01
      相关资源
      最近更新 更多