Java變量的默認值和初始化
學習自
- 《Thinking In Java》
- 技術小黑屋-為什么局部變量需要顯式設置初始化值
變量的默認值
注意只有成員變量才有默認值,而局部變量必須要賦初值。為什么會這么設計,下面會討論。
關於各種基礎類型的默認值,大家肯定都耳熟能詳了,這里就不在叨叨,詳見下表:
| 類型 | 值 |
|---|---|
| Int | 0 |
| Long | 0 |
| Boolean | false |
| float | 0.0 |
| double | 0.0 |
| char | /u0000(NULL) |
| String | NULl |
| Object(代表所有的類) | NULL |
| 數組(未初始化) | NULL |
| 數組(已初始化) | 數組各個元素的值為,其類型的默認值 |
關於上表可以使用一下程序檢測
public class Measurement {
int i;
long l;
boolean b;
float f;
double d;
char c;
String s;
Object o;
int[] ints;
public void printAll() {
System.out.println("Java各數據類型的初始值如下\n" +
"Int:" + i + "\n" +
"Long:" + l + "\n" +
"Boolean:" + b + "\n" +
"Float:" + f + "\n" +
"Double:" + d + "\n" +
"Char:" + c + "\n" +
"String:" + s + "\n" +
"Object:" + o + "\n" +
"Array:" + ints + "\n"
);
}
}
為什么有默認值
這個問題很好回答, 因為有些成員變量在初始的時候不知道賦什么初始的值 😂 . 所以為了解決這個問題,Java干脆就直接給沒有顯式初始化的成員變量賦一個初始值。
初始值賦值的流程
成員變量賦默認值的過程是依照從上到下的循序來的。這一點,我們可以通過IDE來進行一下證明。
下面的程序是沒有問題的,可以正常編譯和運行
public class Circle {
double r;
double area = 3.14 * r * r;
}
再嘗試下面的代碼.
public class Circle {
double area = 3.14 * r * r;
double r;
}
上面的代碼,根本就無法通過編譯,編譯器提示出現了 向前引用 的錯誤。從這個細節我們就可以推斷出,默認值的的賦值過程是從上到下的。
局部變量必須顯示初始化
上面我們提到了成員變量的默認值,那為什么在方法中的局部變量必須要顯示地初始化呢?我想大家都寫過類型下面這樣的代碼(直直接對一個沒有初始化的變量進行操作)。
public void test() {
int i;
i++;
}
顯然,編譯器 在這里顯得有點“事多兒”,可以轉念一想確實應該這樣做,在上面的代碼中如果 i 直接就有一個默認值的話,那么上面就不會保存,但是我們的業務可能並不是想要 i 變量的初始值是 0 , 因為出現這種情況的時候,絕大部分是忘記了給變量初值,而不是想要使用變量的默認值,所以編譯器就事先就替我們解決了這個問題--所有的局部變量必須要有初值 通過這種強制的手段來避免了很多無謂的錯誤。
那么為什么局部變量,又有默認值了呢?那是因為,如果必須要為一個成員變量顯示地賦初值,那這真是一個令人傷腦筋的事情,在編程的時候,一般來說,成員變量的初始值並不會被在聲明的時候就賦值,因為有很多的成員變量需要經過一系列的計算才能得到其值(並不能直接賦予)。所以編譯器在這又顯得有點“碌碌無為”。
