public class Ex
{
int a;
public Ex()
{
System.out.println("a is "+a);
}
}
輸出:一個是0其中instance變量初始化得到
其中一個被初始化...
我知道,對於int默認值是zero..my問題是,它得到初始化..通過默認的構造函數嗎?(我聽說默認的構造函數創建時,當我們沒有提到類中的任何構造函數)
public class Ex
{
int a;
public Ex()
{
System.out.println("a is "+a);
}
}
輸出:一個是0其中instance變量初始化得到
其中一個被初始化...
我知道,對於int默認值是zero..my問題是,它得到初始化..通過默認的構造函數嗎?(我聽說默認的構造函數創建時,當我們沒有提到類中的任何構造函數)
如果你沒有初始化a
(這是一個原始值),它會自動初始化到它的默認值, 0在這種情況下。
閱讀第4.5.5節。 (變量的初始值)this document。
的int
具有0
默認值見this link找出不同的默認值取決於類型。(Default Values
部)
a未被初始化,所以它給出零值,因爲int的默認值爲0.
a
具有原始類型int
。在您的代碼中,未初始化a的默認值爲0
。
當聲明一個字段時,並不總是需要賦值。
已聲明但未初始化的字段將由編譯器設置爲合理的默認值。一般來說,根據數據類型的不同,此默認值將爲零或空值。
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:依賴於這種默認值,但是,通常被認爲是糟糕的編程風格。
絕對不在默認構造函數中。根據JLS,在任何構造函數調用之前,它將作爲類實例創建表達式的評估的一部分(當您執行new ClassName...
時)。從the JLS 3rd edition, 15.9.4:
接下來,空間分配給新的 類實例。如果 沒有足夠的空間分配 對象,則 實例創建表達式通過拋出 OutOfMemoryError(第15.9.6節)突然完成 。
新的對象包含了新的實例在 指定類類型和它的所有 超聲明的所有字段的 。當創建每個新字段 實例時,它會將 初始化爲默認值(§4.12.5)。
接下來,評估構造函數 的實際參數, 從左到右。如果任何參數 評估突然完成,則其右側的任何 參數表達式都不會被評估,並且類實例 創建表達式由於相同的原因突然完成 。
接下來, 指定的類類型的選定構造函數被調用。這個 導致調用至少一個 類型的每個超類的構造函數。這個過程可以是 ,由顯式構造函數 指導調用語句(§8.8),並且 在§12.5中詳細描述。
在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)
被稱爲構造函數中。
對於靜態字段,在類加載期間進行初始化
「我的問題是,**它在何處被初始化」(強調已添加)。 – Raedwald 2011-02-02 12:13:13
@Readwald ok檢查更新:)和閱讀更多也回答了這個。 – 2011-02-02 12:17:15