2014-09-27 55 views
0

修改靜態變量爲了解釋我將使用的示例使用超類類型來過濾模板中刪除在超

//Superclass.java 
public class Superclass 
{ 
    static String TypeInfo = "Superclass"; 
} 

//Subclass.java 
public class Subclass extends Superclass 
{ 
    static { 
     TypeInfo = "Subclass"; 
    } 
} 

//Main.java 
public class Main { 

    public static void main(String[] args) 
    { 
     System.out.print(GetTypeInfo(Subclass.class)); 
    } 
    public static <T extends Superclass> String GetTypeInfo(Class<T> c) 
    { 
     return T.TypeInfo; 
    } 
} 

當class是模板化的,來自類加載器的所有信息似乎都丟失了,或者jvm取最初的超類的子類的價值,爲什麼劑量所有由子類靜態初始化的信息在模板化時變得隱藏?

+0

在Java中沒有像「模板化」這樣的東西。無論Generic類型參數如何,'GetTypeInfo'將始終執行相同的操作,即在您的情況下讀取相同的'static'字段。由於代碼中只有一個字段,因此只能檢測是否執行了覆蓋該字段的「Subclass」的初始化程序。 [fabian解釋了爲什麼它沒有](http://stackoverflow.com/a/26074392/2711488) – Holger 2014-09-27 21:11:40

回答

1

Subclass ins永不初始化,因此static塊永不運行。

根據JLS 12.4.1. "When Initialization Occurs "一個類只有初始化在下列情況下:

  • 創建該類的一個實例
  • 在類聲明的靜態方法調用
  • 靜態非恆定在該類中聲明的字段被訪問
  • 該類是頂級類,並且執行在該類內詞彙嵌套的斷言語句

如果通過它聲明的類的子類訪問某個字段,它的效果與使用它聲明的類調用的效果相同。

使用反射也可能導致初始化。

這些條件都不符合Subclass,因此永遠不會執行靜態塊。


如果Subclass被初始化,您會得到預期的結果,例如,如果你使用這個主要方法:

public static void main(String[] args) { 
    new Subclass(); 
    System.out.print(GetTypeInfo(Subclass.class)); 
}