2

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

//第 1 类

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) {

      }
}

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

4

2 回答 2

10

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

根据JLS 12.4.1

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

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

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

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

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

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

于 2013-06-19T07:47:32.280 回答
1

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

于 2013-06-19T07:46:59.293 回答