2010-04-24 69 views
2
  1. 你主要在哪裏使用初始化塊?
  2. 你可以使用它們爲靜態實例變量賦值嗎?
  3. 這與使用構造函數進行賦值有什麼不同?
  4. 我的書說,當「class被加載」時,初始化塊被執行。加載一個班是什麼意思?

附加問題 哪個更好?關於Java中的初始化塊的一些問題

class {static final instance-variable = val} 

class {static final instance-variable; static {instance-variable=val}} 
+0

每個帖子的多個問題*太寬*帖子。 – Raedwald 2016-01-22 11:03:13

回答

4

塊初始化總是叫無論你想使用的構造。因此,如果所討論的類有多個構造函數,並且您希望運行一些代碼而不考慮所使用的構造函數,則使用初始化塊。

但是,當用於指定默認值時,我只是直接分配它們。如果他們甚至是常量,那麼我會將final也添加到修飾符列表中。

private static final String VAL1 = "VALUE"; 

更新因爲你徹底改變的問題,這裏有一個更新的答案:

1)你去哪兒主要用於初始化塊?

要執行一些代碼,不管使用的構造函數如何。

2)你可以使用它們來爲靜態實例變量賦值嗎?

您需要一個static初始化塊。

private static final String FOO; 

static { 
    FOO = "bar"; 
} 

這樣做的好處是您可以做的不僅僅是分配一個值。例如。從某種方法獲得它並處理異常:

static { 
    try { 
     FOO = getItSomehow(); 
    } catch (Exception e) { 
     throw new ExceptionInInitializerError(e); 
    } 
} 

3)如何從使用構造函數分配有何不同?

無論使用何種構造函數,它都會被分配。

4)我的書說初始化塊是在「類被加載」時執行的。加載一個班是什麼意思?

這本書實際上講的靜態初始化塊。當您在代碼中第一次引用它時,通常會加載一個類。你也可以通過Class#forName()(比如你使用JDBC驅動程序)強制加載它。我在here之前發佈了一個更多示例和解釋的答案。

希望這會有所幫助。

+0

哇,這是一個詳細的答案。謝謝。我不能在6分鐘內接受它):) – unj2 2010-04-24 04:29:16

1

附加問題哪個更好?

class {static final instance-variable = val} 

class {static final instance-variable; static {instance-variable=val}} 

他們有相同的行爲。在這種情況下,第一種形式更好,因爲它不那麼冗長,而且更容易閱讀。

如果初始化爲太複雜使用一系列帶有初始化表達式的靜態聲明來清楚地表示,則只使用靜態初始化塊。