2014-02-21 136 views
10

我正在學習有關Java的考試。在我學習的時候,我遇到了java中不熟悉的語法。比如花括號({})取消沒有名稱的類體,有一些靜態關鍵字。我發現他們被稱爲「初始化器」。任何人都可以幫助我指出它們之間的關鍵區別以及它們與構造函數的不同之處。謝謝靜態初始化器與實例初始化器與構造函數

+0

我推薦你這本書http://www.apress.com/9781430247647第3和4章 – Leo

+0

@Reieus他還問了關於匿名代碼塊 – jeremyjjbrown

回答

20

他們之間的主要區別是他們執行的順序。爲了說明,我將解釋它們用一個例子:

public class SomeTest { 

    static int staticVariable; 
    int instanceVariable;   

    // Static initialization block: 
    static { 
     System.out.println("Static initialization."); 
     staticVariable = 5; 
    } 

    // Instance initialization block: 
    { 
     System.out.println("Instance initialization."); 
     instanceVariable = 10; 
    } 

    // Constructor 
    public SomeTest() { 
     System.out.println("Constructor executed."); 
    } 

    public static void main(String[] args) { 
     new SomeTest(); 
     new SomeTest(); 
    } 
} 

的輸出將是:

Static initalization. 
Instance initialization. 
Constructor executed. 
Instance initialization. 
Constructor executed. 

簡言之說話:

  • 靜態初始化塊運行一次的類是由加載JVM。
  • 實例初始化塊在每次實例化對象時在構造函數之前運行。
  • 構造函數(顯然)每次你實例化一個對象時運行。
+7

這是一個很好的答案。但我想補充一點,構造函數比實例初始化函數更普遍。我認爲初始化器的主要用例是用於在匿名內部類中進行初始化,因爲它們缺少名稱,所以不能有構造函數。 –

+0

非常簡單且很好的示例+1 –

1

創建類的新實例時會調用構造函數。在構造函數中初始化的值屬於實例的範圍。對於在構造函數中初始化的相同字段,每個實例可以具有不同的值。

靜態初始化程序對於在靜態類中執行設置代碼並填寫枚舉中的數據結構非常有用。當Class被加載到JVM中並且數據存在於Class或Enum的範圍內時,它們從上到下依次調用一次。所有對類的引用將返回在靜態初始化程序中初始化的字段的相同值。

未命名的大括號是範圍引用名稱的匿名代碼塊。如果在塊內創建引用,則無法在塊之外獲取該引用的值。如果你發現自己需要他們,這是你需要將代碼重構爲更多方法的標誌。

+0

「未命名的大括號」稱爲[實例初始化程序](http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.6 ) –

0

這是你真正需要在教科書中尋找答案的那種東西。不過,我可以給你一些指示。自從我對Java編程以來,這已經有好幾年了,所以我給你的任何信息都是一般的。

一般而言,帶花括號的無名塊是一個匿名函數。靜態初始化器初始化該類的所有實例全局的數據,並在第一次引用類時運行。你需要小心你如何使用靜態屬性或方法。有了這些信息,你可以在你的教科書中找到準確的細節。

相關問題