1. 程式人生 > >淺談final修飾的變數

淺談final修飾的變數

一直大概的知道final關鍵字的作用,但是自己實際工作中卻很少用,除非在宣告一些常量值的時候,今天忽然自己在專案中用一個map進行儲存一些值。一開始我只是用private修飾的,心裡想的是如果final修飾的話,應該不能修改了。畢竟被final修飾的變數不可變。今天回家後,做了下面的嘗試,徹底暴露出自己基礎的不紮實。

final的作用

  • 被final修飾的類不可以被繼承

  • 被final修飾的方法不可以被重寫

  • 被final修飾的變數不可變

實戰演示

1、首先看下面程式碼

public class FinalDemo {
    private static final Map<String, Object> NAME = new HashMap<>(16);
    private static final List<String> LIST = new ArrayList<>(10);
    private static final String[] TYPE = new String[15];
    private static final StringBuilder SB = new StringBuilder("22");
    private static final StringBuffer SBU = new StringBuffer("22");
    private static final String S = "44";
    private static final int num = 44;
    private static final String S1 = new String();



    public void setName() {
        NAME.put("1", "maomao");
        LIST.add("11");
        TYPE[0] = "1";
        SB.append("12");
        SBU.append("32");
        System.out.println(NAME);
        System.out.println(LIST);
        System.out.println(Arrays.asList(TYPE));
        System.out.println(SB.toString());
        System.out.println(SBU.toString());
    }

    public static void main(String[] args) {
        FinalDemo finalDemo = new FinalDemo();
        finalDemo.setName();
    }


}

2、執行結果

{1=maomao}
[11]
[1, null, null, null, null, null, null, null, null, null, null, null, null, null, null]
2212
2232

3、由此可見:

  • 用了map、list、陣列、StringBuilder 、StringBuffer .它們的內容是可以修改的。
  • String和基本資料型別修飾的變數。同樣final表示地址不能修改,但是地址的儲存跟常量的值有關,給他重新賦值會指向另外一個物件,地址就改變了。

總結

被final修飾的變數,不可變的是變數的引用,而不是變數的內容

當然,final還有其他作用,比如:

  • 被final修飾的常量,在編譯階段會存入呼叫類的常量池中

這一塊暫時不先探討,現在自己水平還沒到。還需要繼續努力。