1. 程式人生 > >final修飾的值真的不能改變嗎?

final修飾的值真的不能改變嗎?

首先,final可以修飾基本型別的變數,也可以修飾引用型別。

那麼,final修飾的變數的值真的不可以改變嗎?先看下面的程式碼:

class Test {
    public static void main(String[] args) {
       A a=new Test().new A();
       A c=new Test().new A();
        final A b = a;
        System.out.println(b.val);
        a.val = 200;
        System.out.println(b.val);
        b.val = 300;
        System.out.println(b.val);
    }
    class A {
        int val = 100;
    }
}

執行結果:

100
200
300

具體看下圖進行分析:

首先用通俗易懂的語言解釋一下幾個名詞:

引用變數:儲存引用的變數,作用就是存放引用

引用:指向某個物件地址的方向標,有了某個物件的引用,就可以訪問這個物件

引用型別:初學者遇到的只要是能用new關鍵字造出來的例項都是,比如陣列,字串,以及其他各種類的例項。

如上邊左圖所示,給引用變數賦值A物件,實際上就是把物件A的引用存入這個引用變數,然後我們就可以通過這個引用變數去操作物件A,如果我們再把物件B賦值給這個引用變數,那麼實際上就是用B的引用去替換了引用變數中原本存放的A的引用,所以現在可以使用引用變數訪問物件B,而不能訪問物件A。

而上邊右圖所示,如果把物件A的引用存入這個final修飾的引用變數之後,引用變數就變為引用常量。不能再儲存新的引用,也就是說無法把B的引用存入這個引用常量。但是我們可以通過A的引用去改變這個引用所指向的地址的內容!

所以final修飾的變數可以這麼理解:修飾基本型別值不變,修飾引用型別只是引用不可變,但是引用所指向的地址的內容可以改變。