一直大概的知道 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 修饰的常量, 在编译阶段会存入调用类的常量池中
这一块暂时不先探讨, 现在自己水平还没到. 还需要继续努力.
来源: https://www.cnblogs.com/zhenghengbin/p/9678123.html