[英]Are default field values assigned by the compiler or the JVM?
我有一個問題:在 Java 中,我們聲明 int、long、double 等(原始數據)或非原始數據(對象數據),未使用默認值進行初始化,但在運行時它將采用默認值。 現在我的問題是哪個分配默認值:java 編譯器或 Java 虛擬機 (JVM)?
例如:
int x;
System.out.println(x) //Result is 0;
Java 中有三種不同類型的聲明變量。 它們是實例、類和局部變量。
實例變量
實例變量是類的非靜態字段,通常簡稱為字段。
原始數字字段初始化為 0。這包括byte
、 short
、 int
、 long
、 float
和double
。
boolean
s 初始化為false
。
char
s 初始化為空字符\
。
引用類型初始化為null
。
類變量
類變量是類中聲明為靜態的字段,通常稱為靜態變量或靜態字段。 它也與實例變量相同的初始化。
局部變量
局部變量是在方法中定義的變量,它包括任何方法參數。 局部變量在使用前必須初始化。 它們沒有默認值。
初始化過程在方法創建時由JVM完成。
字段的默認值由 JVM 在運行時分配。 從JLS 15.9.4 (強調我的):
新對象包含在指定類類型及其所有超類中聲明的所有字段的新實例。 在創建每個新字段實例時,它會被初始化為其默認值。
當然,考慮到這種行為在 JLS 中是標准化的,編譯器可以基於未初始化的字段以其默認值開始的假設,利用這一點來執行某些優化。
字段在任何類型中都被初始化為等價於 0(引用類型為null
)。 這篇文章給出了一個不錯的列表:
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)。 這適用於字段和局部數組變量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.