2014-03-13 45 views
2

我有一個問題:在java中,我們聲明int,long,double等,(原始數據) 或非原始數據(對象數據),未用默認值初始化,但在運行 時它將採用默認值。現在我的問題是哪一個分配 默認值:java編譯器或Java虛擬機(JVM)?是由編譯器或JVM分配的默認字段值嗎?

例如:

int x; 
System.out.println(x) //Result is 0; 
+1

JVM執行它 - 默認值在對象創建期間在運行時分配。請參閱[JLS 15.9.4](http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.9.4):*「新對象包含新實例在指定的類類型及其所有超類中聲明的所有字段在創建每個新字段實例時,它將初始化爲其默認值。「* –

+0

順便說一句,您的示例不會編譯(假設'x'是本地變量)。 –

+0

雅我知道局部變量需要intilize使用前我得到答案,哪一個分配默認值的數據類型thq所有 – user1990992

回答

5

Java中有三種不同類型的聲明變量。它們是實例,類和局部變量。

實例變量

實例變量類的非靜態字段,通常簡稱爲域。

  • 原始數字字段初始化爲0。這包括byteshortintlongfloatdouble

  • boolean s初始化爲false

  • char s初始化爲空字符\u0000

  • 引用類型初始化爲null

類變量

類變量聲明爲靜態的一類中的一個字段,通常被稱爲靜態變量或靜態字段。它也與實例變量初始化相同。

局部變量

局部變量是一種方法,其包括任何方法 參數範圍內定義的變量。 局部變量在使用前必須初始化。他們沒有默認值。

當創建方法時,初始化過程由JVM完成。

4

爲字段的默認值由JVM在運行時分配的。從JLS 15.9.4(重點是我的):

新對象包含在指定的類類型及其所有超類中聲明的所有字段的新實例。 創建每個新字段實例時,它都被初始化爲默認值。

當然,考慮到這種行爲是在JLS規範,編譯器可以想見,利用這一點來執行基於未初始化的領域開始與他們的默認值的假設某些優化。

字段被初始化爲等於0的任何類型(參考類型爲null)。 This article給出了一個很好的列表:

 
Data Type:    Default Value: 
boolean     false 
char     \u0000 
int,short,byte/long 0/0L 
float/double   0.0f/0.0d 
any reference type  null 

局部變量沒有給出一個初始值,它是一個編譯器錯誤使用他們,如果他們不通過在使用之前所有可能的代碼路徑分配一個值。

請注意,當創建新數組(例如,new int[100]的每個元素將初始化爲0)時,數組元素會自動初始化爲默認值。這適用於字段和本地數組變量。