一直大概的知道final关键字的作用,但是自己实际工作中却很少用,除非在声明一些常量值的时候,今天忽然自己在项目中用一个map进行存储一些值。一开始我只是用private修饰的,心里想的是如果final修饰的话,应该不能修改了。毕竟被final修饰的变量不可变。今天回家后,做了下面的尝试,彻底暴露出自己基础的不扎实。

  • 被final修饰的类不可以被继承

  • 被final修饰的方法不可以被重写

  • 被final修饰的变量不可变

1、首先看下面代码

  1. public class FinalDemo {
  2. private static final Map<String, Object> NAME = new HashMap<>(16);
  3. private static final List<String> LIST = new ArrayList<>(10);
  4. private static final String[] TYPE = new String[15];
  5. private static final StringBuilder SB = new StringBuilder("22");
  6. private static final StringBuffer SBU = new StringBuffer("22");
  7. private static final String S = "44";
  8. private static final int num = 44;
  9. private static final String S1 = new String();
  10. public void setName() {
  11. NAME.put("1", "maomao");
  12. LIST.add("11");
  13. TYPE[0] = "1";
  14. SB.append("12");
  15. SBU.append("32");
  16. System.out.println(NAME);
  17. System.out.println(LIST);
  18. System.out.println(Arrays.asList(TYPE));
  19. System.out.println(SB.toString());
  20. System.out.println(SBU.toString());
  21. }
  22. public static void main(String[] args) {
  23. FinalDemo finalDemo = new FinalDemo();
  24. finalDemo.setName();
  25. }
  26. }

2、运行结果

  1. {1=maomao}
  2. [11]
  3. [1, null, null, null, null, null, null, null, null, null, null, null, null, null, null]
  4. 2212
  5. 2232

3、由此可见:

  • 用了map、list、数组、StringBuilder 、StringBuffer .它们的内容是可以修改的。
  • String和基本数据类型修饰的变量。同样final表示地址不能修改,但是地址的存储跟常量的值有关,给他重新赋值会指向另外一个对象,地址就改变了。

被final修饰的变量,不可变的是变量的引用,而不是变量的内容

当然,final还有其他作用,比如:

  • 被final修饰的常量,在编译阶段会存入调用类的常量池中

这一块暂时不先探讨,现在自己水平还没到。还需要继续努力。

版权声明:本文为zhenghengbin原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/zhenghengbin/p/9678123.html