2013-06-19 124 views
2

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

// 1类

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

// Class2中

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

     public static void main(String [] args) { 

     } 
} 

基本上我有在父类的一些方法,该方法我要继承但不希望它在父静块发生的处理在实例化派生类时发生。 。有没有办法做到这一点,否则我将不得不复制代码?它不可能。

+2

“否” 的回答。现在,一个问题:你为什么要这么做? – fge

+0

似乎不好的设计。是否有可能将父级的静态代码重构到其构造函数中? – Supericy

+1

你真的不希望静态内测器做除了设置常量之外的任何事情。 –

回答

10

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

作为每JLS 12.4.1

当初始化时,会发生类或接口类型T将紧接在以下中的任何一个的第一次出现之前被初始化:

•T是一个类和T的实例被创建。

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

•指定由T声明的静态字段。

•用于由T中声明的静态场和该场不是一个常数变量(§4.12.4)。

•T是顶层类(第7.6节),和(§8.1.3)被执行断言语句(§14.10)词法嵌套T内。

+0

又名“静态是邪恶的”。 – vikingsteve

1

它不可能。静态块类加载期间执行,你不能阻止这种不重构父类不使用的静态块