2012-09-07 59 views
1

可能重複:
Static Initialization Blocks靜態{}塊的用途/優點是什麼?

在審查一些舊的代碼,我發現了一些相當奇怪的語法,我以前從未見過。在做了一些研究之後,我現在知道我看到的是一個static{}塊(如果我理解正確的話)是在初始化時執行的代碼塊。

我不明白的是擁有這樣一個功能的好處,或者當人們可能想要使用它時。看起來靜態塊只包含普通的代碼行,它可以屬於任何常規的靜態方法,所以在初始化時自動運行有什麼好處(除了保存程序員一行代碼來調用方法) ?爲什麼這很重要或有用?

回答

1

正如你所說,靜態塊在初始化時執行。 說你有一個靜態字段,它可以是相當複雜的,例如

private static List<ThingsDownloadedByTheNet> ls; 

只是做

private static List<ThingsDownloadedByTheNet> ls = new ArrayList<ThingsDownloadedByTheNet> 

可能是不夠的,因爲你也許要設置列表元素了。 所以,你做一個靜態塊,在其中執行一些初始化(在這種情況下,你連接到服務器並填充列表元素)

2

把它看作靜態變量的構造函數。它讓你有機會在任何人使用它們之前初始化它們。

+4

也許更重要的區別是,你可以初始化多個最終變量,不要使用方法調用。 – jtahlborn

+0

@jthalborn,謝謝。我沒有意識到你可以在'static {}'塊中操作'final'變量。結合以下有關初始化複雜對象類型的答案,可以回答這個問題。 – asteri

0

static{}在加載類時執行塊。您可以使用它來初始化靜態字段或調用靜態方法。您不能使用任何方法來替換此行爲,因爲類「沒有構造函數」。其實你可以看到這是一個「類構造函數」。

+0

實際上,您可以使用靜態方法來初始化靜態成員。 – jtahlborn

+0

我知道。我的意思是這樣的方法不是在類加載時啓動的,所以如果你想要執行這樣的代碼,你必須從其他代碼中調用它們。 – m0skit0

+1

你可以調用一個靜態方法來初始化一個靜態成員,例如'private static final MY_VAR = someStaticMethod()'。 (這是在上課時間執行的) – jtahlborn

3

當他們在Java Tutorials說:

如果初始化需要一些邏輯(例如,錯誤處理或一個for循環填充複雜的陣列),簡單的賦值是不夠的。實例變量可以在構造函數中初始化,其中可以使用錯誤處理或其他邏輯。爲了爲類變量提供相同的功能,Java編程語言包括靜態初始化塊。