[英]Initialization of Instance Variables in Java
當我們提供了自己的默認構造函數並且沒有在其中初始化 id 時,實例變量 id 如何初始化為 0? output變成了id:0 status:B id 0怎么來的?
`class Demo{
private int id;
private char status;
public Demo(){
status = 'B';
}
public void display(){
System.out.println("Id:="+id+" Status:"+status);
}
public static void main(String args[]){
Demo ob = new Demo();
ob.display();
}
}`
以下是默認初始化
下表總結了上述數據類型的默認值。
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
在Java中,每個未初始化的變量都會自動初始化為聲明的類型的默認值,即:
基本類型默認為某些值。 對於int為0。
TL;DR - 實例變量有默認值。 見[1]。
您對 state 的值是零,或者更確切地說是 0 是正確的。這是因為在 Java 中,實例變量是駐留在 class 中的變量,但不是方法,不必手動初始化。
在 Java 中,當聲明實例變量時,如果沒有給出值,編譯器將應用默認值以允許程序運行。 雖然這可以在您可能希望稍后更改實例變量的值的情況下使用,但它通常被認為是不好的做法。
請參閱此處,Java 文檔:
默認值
聲明字段時並不總是需要賦值。 已聲明但未初始化的字段將由編譯器設置為合理的默認值。 一般來說,此默認值將為零或 null,具體取決於數據類型。 然而,依賴於這樣的默認值通常被認為是糟糕的編程風格。
有關每個數據類型的默認值的信息,請參閱 [1]。
該文檔包含有關其他變量的更多信息,即本地:
局部變量略有不同; 編譯器永遠不會為未初始化的局部變量分配默認值。 如果您不能在聲明局部變量的地方對其進行初始化,請確保在嘗試使用它之前為其分配一個值。 訪問未初始化的局部變量將導致編譯時錯誤。
局部變量和實例變量之間的差異(在 JVM 處理它們的方式上)的原因是實例變量被加載到稱為“堆”[2] 的 memory 區域,而局部變量是加載到一個單獨的 memory 區域,稱為“堆棧”[2]; 盡管現在也有例外 [3]。 堆存儲對象和對對象的引用,因此,實例變量與其對象一起存儲。 最終,做出了一個相當隨意的選擇,它強制初始化局部變量,而不是實例變量。
[1] https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
實例變量使用默認值初始化,整數則為0。
id
是基本類型int
,默認值為0
。
你在想物體
實際上是對對象的引用,它們默認為null
,表示它們不指向任何對象。
int
類型的默認值為0
。 http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
聲明字段時,不一定總是需要分配值。 編譯器會將已聲明但未初始化的字段設置為合理的默認值。 通常,此默認值將為零或null,具體取決於數據類型。 但是,通常認為依賴於此類默認值是不好的編程風格。
下表總結了上述數據類型的默認值。
+------------------------+----------------------------+
| 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 |
+------------------------+----------------------------+
“對於int類型,默認值為零,即0”。
您可以在語言規范中看到默認值: http : //docs.oracle.com/javase/specs/jls/se5.0/html/typesValues.html#96595
根據您的代碼,id是一個實例變量,如果未定義實例變量,則它將使用默認值。 在您的情況下,由於id為int,因此值為0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.