2012-03-24 104 views
1

這裏是我的代碼段我'正與初始化塊的信心初始化塊與延伸

class Father{ 
Father() { 
    System.out.println("Father constructor runs..."); 
} 
static {System.out.println("static init block of Father...");} 
{System.out.println("instance init block of Father...");} 
} 

class Child extends Father { 
Child() { 
    System.out.println("Child constructor runs..."); 
} 
static {System.out.println("static init block of Child ...");} 
{System.out.println("instance init block of Child ...");} 
public static void main (String[] argv) { 
    new Child(); 
} 

}

這兩個類被編譯成一個單一的類文件:Child.class 我跑它的命令行Java兒童

這是我的輸出中:

static init block of Father... 
static init block of Child ... 
static init block of Child ... 
instance init block of Father... 
Father constructor runs... 
instance init block of Child ... 
Child constructor runs... 

對於這個輸出我很好,除了「靜態初始化子塊...」被打印兩次。從java文檔我讀「靜態初始化塊運行一次,當第一次加載類」。

那麼這是否意味着我的類Child被加載兩次?

任何幫助表示讚賞 感謝 阿爾貝託

+2

我試過這個,'Child的靜態初始塊'只打印一次(使用OpenJDK Runtime Environment(IcedTea6 1.9.13)(6b20-1.9.13-0ubuntu1〜10.10.1))。你確定你用這段代碼得到了兩次消息嗎? – esaj 2012-03-24 10:28:19

回答

2

無法重現 - 這裏的輸出,通過在命令行中運行它,我從你的代碼獲得:

static init block of Father... 
static init block of Child ... 
instance init block of Father... 
Father constructor runs... 
instance init block of Child ... 
Child constructor runs... 

你還沒說你怎麼'重新運行代碼,但我懷疑或者輸出結果不是你想象的那樣,或者你以某種奇怪的方式運行它。

您的期望是正確的:靜態初始化塊應該只運行一次。

+0

實際上,我的意外輸出的問題與另一個Child類(與上面的不同)存在於我的類路徑中。我還沒有很好地理解這個其他Child類如何幹擾輸出,但是肯定的是:移除這個其他的子類可以解決意外的輸出。 – 2012-03-24 10:51:58