java10 var關鍵字淺析

煮湯的那個人發表於2018-07-29

2018年3月20日,Oracle釋出java10。java10為java帶來了很多新特性,其中讓人眼前一亮的便是var關鍵字的引入。

從今以後我們可以這樣寫java程式碼了。

public class Example {
    public static void main(String[] args) {
        var eg = new Example;
        eg.emptyFunc();
    }

    public void emptyFunc() {}
}

很方便是吧,但是java在var上是有要求的。總結起來,有以下三點很重要:

(1)只能用於區域性變數上;

(2)宣告時必須初始化;

(3)不能用作方法引數。

這三點很重要,但也讓我看出了點什麼,我大膽猜想,是不是javac會在編譯時,悄悄將var換成所賦值的型別呢?

在java1.10的環境下,我們編譯上面的程式碼。

藉助於IDEA我們反編譯上面的位元組碼檔案Example.class結果如下:

var關鍵字被替換成了Example。 固然,驗證了我們的猜想。我們再來看看下面這些程式碼:

public class UseVar {
    public void baseTypeVar() {
        var a = 1;
        var b = 255;
        var c = 256;
        var d = 10L;
    }
}

在java10環境下,我們使用javac編譯上面的程式碼,然後藉助於IDEA反編譯得到的位元組碼檔案UseVar.class檔案

很奇怪,a, b, c都被反編譯成boolean型別了,倒是d被反編譯成long型了,符合預期的結果。至於a, b, c成為boolean型別,倒也驗證了我另一篇文章裡講的,jvm是把java中的boolean當做int來理解了。總而言之,var在編譯階段是被會替換成所賦值的型別。

這也驗證了上面的三個要求中的兩個,為什麼var宣告變數時必須初始化,以及為什麼不能用作方法引數。

【總結】:本質上,java仍然是靜態強型別語言,var可以理解為java的一個語法糖。

【問題】:var為什麼只能宣告區域性變數?var宣告的變數可以被再次賦值嗎?

相關文章