一直大概的知道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修飾的常量,在編譯階段會存入調用類的常量池中
這一塊暫時不先探討,現在自己水平還沒到。還需要繼續努力。