Java變量的默認值和初始化


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 , 因為出現這種情況的時候,絕大部分是忘記了給變量初值,而不是想要使用變量的默認值,所以編譯器就事先就替我們解決了這個問題--所有的局部變量必須要有初值 通過這種強制的手段來避免了很多無謂的錯誤。

那么為什么局部變量,又有默認值了呢?那是因為,如果必須要為一個成員變量顯示地賦初值,那這真是一個令人傷腦筋的事情,在編程的時候,一般來說,成員變量的初始值並不會被在聲明的時候就賦值,因為有很多的成員變量需要經過一系列的計算才能得到其值(並不能直接賦予)。所以編譯器在這又顯得有點“碌碌無為”。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM