2011-02-02 37 views
3
public class Ex 
{ 
    int a; 
    public Ex() 
    { 
     System.out.println("a is "+a); 
    } 
} 

輸出:一個是0其中instance變量初始化得到

其中一個被初始化...

我知道,對於int默認值是zero..my問題是,它得到初始化..通過默認的構造函數嗎?(我聽說默認的構造函數創建時,當我們沒有提到類中的任何構造函數)

回答

6

如果你沒有初始化a(這是一個原始值),它會自動初始化到它的默認值, 0在這種情況下。

閱讀第4.5.5節。 (變量的初始值)this document

5

它的默認值是0,

它並不總是必要的,當某個字段聲明分配一個值。已聲明但未初始化的字段將由編譯器設置爲合理的默認值。

enter image description here

+1

「我的問題是,**它在何處被初始化」(強調已添加)。 – Raedwald 2011-02-02 12:13:13

+0

@Readwald ok檢查更新:)和閱讀更多也回答了這個。 – 2011-02-02 12:17:15

1

int具有0

默認值見this link找出不同的默認值取決於類型。(Default Values部)

1

a未被初始化,所以它給出零值,因爲int的默認值爲0.

1

a具有原始類型int。在您的代碼中,未初始化a的默認值爲0

1

當聲明一個字段時,並不總是需要賦值。
已聲明但未初始化的字段將由編譯器設置爲合理的默認值。一般來說,根據數據類型的不同,此默認值將爲零或空值。

Data Type Default Value (for fields) 
byte 0 
short 0 
int  0 
long 0L 
float 0.0f 
double 0.0d 
char '\u0000' 
String (or any object)  null 
boolean  false 

PS:依賴於這種默認值,但是,通常被認爲是糟糕的編程風格。

3

絕對不在默認構造函數中。根據JLS,在任何構造函數調用之前,它將作爲類實例創建表達式的評估的一部分(當您執行new ClassName...時)。從the JLS 3rd edition, 15.9.4

接下來,空間分配給新的 類實例。如果 沒有足夠的空間分配 對象,則 實例創建表達式通過拋出 OutOfMemoryError(第15.9.6節)突然完成 。

新的對象包含了新的實例在 指定類類型和它的所有 超聲明的所有字段的 。當創建每個新字段 實例時,它會將 初始化爲默認值(§4.12.5)。

接下來,評估構造函數 的實際參數, 從左到右。如果任何參數 評估突然完成,則其右側的任何 參數表達式都不會被評估,並且類實例 創建表達式由於相同的原因突然完成 。

接下來, 指定的類類型的選定構造函數被調用。這個 導致調用至少一個 類型的每個超類的構造函數。這個過程可以是 ,由顯式構造函數 指導調用語句(§8.8),並且 在§12.5中詳細描述。

1

在java實例變量將從構造函數初始化(默認如果你沒有)。

public class TestFile { 
String x = null; 
int y = x.length(); 
    public TestFile() { 
     // TODO Auto-generated constructor stub 
    } 
    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 

     TestFile tf = new TestFile(); 
    } 
} 

你會得到一個堆棧跟蹤

Exception in thread "main" java.lang.NullPointerException 
    at TestFile.<init>(TestFile.java:7) 
    at TestFile.main(TestFile.java:16) 

被稱爲構造函數中。
對於靜態字段,在類加載期間進行初始化