final 變量和普通變量

看下面這個您呢個做對麼?

public class Test {
    public static void main(String[] args) throws Exception {

        String a = "hello2";
        final String b = "hello";
        String d = "hello";
        String c = b + 2;
        String e = d + 2;
        System.out.println((a == c));
        System.out.println((a == e));
        System.out.println(a.equals(c));
        System.out.println(a.equals(e));

        String aa = "hello" + 2;
        System.out.println(aa == a);

        final String bb = getHello();
        System.out.println(bb == a);
    }

    private static String getHello(){
        return "hello";
    }
}






輸出結果:
true
false
true
true
true
false

這裏面就是final變量和普通變量的區別了,當final變量是基本數據類型以及String類型時,如果在編譯期間能知道它的確切值,則編譯器會把它當做編譯期常量使用。也就是說在用到該final變量的地方,相當於直接訪問的這個常量,不需要在運行時確定。這種和C語言中的宏替換有點像。因此在上面的一段代碼中,由於變量b被final修飾,因此會被當做編譯器常量,所以在使用到b的地方會直接將變量b 替換爲它的  值。而對於變量d的訪問卻需要在運行時通過鏈接來進行。想必其中的區別大家應該明白了,不過要注意,只有在編譯期間能確切知道final變量值的情況下,編譯器纔會進行這樣的優化:



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章