簡體   English   中英

默認字段值是由編譯器還是 JVM 分配的?

[英]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。這包括byteshortintlongfloatdouble

  • 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM