淺談final修飾的變數
阿新 • • 發佈:2018-12-10
一直大概的知道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修飾的常量,在編譯階段會存入呼叫類的常量池中
這一塊暫時不先探討,現在自己水平還沒到。還需要繼續努力。