2013-06-19 122 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

它不可能。靜態塊類加載期間執行,你不能阻止這種不重構父類不使用的靜態塊