在java中,final关键字可以对类、方法以及变量进行修饰,这里对final修饰变量进行一些探讨。

final修饰的变量不可更改,其不可更改指的是其引用不可修改。看下列代码:

StringBuffer sb1 = new StringBuffer("sb");
StringBuffer sb2 = sb1;
final StringBuffer finalSb = sb2;
System.out.println(finalSb);//输出: sbsb1.append(" sb1 append");
System.out.println(finalSb);//输出: sb sb1 appendsb2.append(" sb2 append");
System.out.println(finalSb);//输出: sb sb1 append sb2 append

在代码中,无论是对sb1还是sb2进行操作,均可以影响到finalSb的字面值,看似是finalSb → sb2 → sb1,这样一个变量指向另外一个变量,将变量的值复制传递下去。

这里进行一个猜想,原来是finalSb → sb2 → sb1,现在将sb2 → new StringBuffer(" new sb2"),finalSb的字面值是否变化呢?我们看代码输出:

StringBuffer sb1 = new StringBuffer("sb");
StringBuffer sb2 = sb1;
final StringBuffer finalSb = sb2;
System.out.println(finalSb);//输出: sbsb1.append(" sb1 append");
System.out.println(finalSb);//输出: sb sb1 appendsb2.append(" sb2 append");
System.out.println(finalSb);//输出: sb sb1 append sb2 appendsb2 = new StringBuffer("new sb2");
System.out.println(finalSb);//输出: sb sb1 append sb2 appendsb2.append(" xx app");//对sb2进行操作
System.out.println(finalSb);//输出: sb sb1 append sb2 append

通过代码的输出可以看到,哪怕是将sb2重新指向了另外一个新的引用,finalSb的字面值并不会发生改变,对sb2进行的操作,也自然不会影响到finalSb的字面值。

sb1和原来的sb2操作时,可以影响到finalSb的值,新的sb2又不可以影响到finalSb的值,这是为什么呢?这里我画出示意图如下:

sb2并不是直接指向sb1,而是指向的是sb1在堆空间中new出来的对象,同样的,finalSb也不是指向的sb2,而是指向的sb2所指向的堆空间的对象,因为三者均是指向的同一个对象,所以,无论是对哪一个变量进行操作,均会影响到其字面值。

当执行 sb2 = new StringBuffer("new sb2") 时,sb2不再执行堆空间原来的对象,而是指向了新的对象,如图:

sb2已经指向了新的地址,故而对sb2进行怎么样的操作,finalSb的字面值均不会发生变化。

从以上两张图和代码可以看出,final所修饰的变量,其引用不可变(或者是其在内存中指向的地址不可更改),还有就是,基于引用本身的操作(如List类型的add,StringBuffer的append)不受影响。

另外,final修饰的变量还被赋予了编译常量的功能,如代码所示:

final String finalStrA = "str";
String strA = "str";
String strB = "str2";
String strC = finalStrA+"2";
String strD = strA+"2";
String strE = "str"+"2";//等同于 finalStrA+"2"System.out.println(strB==strC);//输出: true
System.out.println(strB==strD);//输出: false
System.out.println(strB==strE);//输出: true

java-final关键字修饰变量相关推荐

  1. Java final关键字修饰变量Test

    使用 final 关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的. package com.test; /*** final修饰一个变量练习* @author M ...

  2. 【Java面试题】3 Java中使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?超详细解析...

    /*  * 问题:使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变  * 答:  * 使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以 ...

  3. 使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?

    使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的.

  4. 用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变

    使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变 答: 使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的. 代码 public ...

  5. java——final关键字、权限、内部类、引用类型

    final关键字代表最终.不可改变的.常见四种用法: 1. 可以用来修饰一个类 2. 可以用来修饰一个方法 3. 还可以用来修饰一个局部变量 4. 还可以用来修饰一个成员变量 当final关键字用来修 ...

  6. Java——final关键字,String为什么不可变

    目录 final是什么? 一.修饰类 二.修饰变量 三.修饰方法 String为什么不可变? 不知道大家有没有这样的疑问:我们在使用某些Java的类或者方法.属性(比如:String类)时,总是会发现 ...

  7. java final 关键字

    java的final关键字 前言 final是 最终 的意思. 在java这门编程语言中,final是一个关键字,它可以被用来修饰类,变量以及成员方法. 被final修饰的变量,又叫被称为 自定义常量 ...

  8. final关键字修饰类,方法以及变量的特点 学习

    A:final概述 B:final修饰特点 修饰类,类不能被继承 修饰变量,变量就变成了常量,只能被赋值一次 修饰方法,方法不能被重写 C:案例演示 final修饰特点 class Demo1_Fin ...

  9. 3.4—4 Java final关键字、接口、数组

    文章目录 一.final 关键字 final修饰属性.方法.类 二.接口 (interface. implement) 1.什么是接口? 1)生活中的接口----USB接口 2)面向接口编程 3)接口 ...

最新文章

  1. NC45实现二叉树先序、中序和后序遍历
  2. Log4j源代码学习
  3. Android中悬浮窗口的实现原理和示例代码
  4. 【Python基础】14_Python中的TODO注释
  5. Spring MVC-10循序渐进之文件下载
  6. Refactor?or Patching?
  7. 利用Service Fabric承载eShop On Containers
  8. 【电路补习笔记】2、电容的参数与选型
  9. Maven详解及实例
  10. C++ 字符串流stringstream(附蓝桥杯2018年第九届真题缩位求和题解)
  11. 脚本语言(确认补遗)
  12. java字节型的关键字_DAY06-07 Java的基础语法-注释、标识符、关键字、数据类型
  13. 昨天又发火了:领导拒不给他人安排工作
  14. 单片机之硬件 软件仿真
  15. Prolog编程求解图搜索问题
  16. C#图片无损转换为ico格式
  17. BUUCTF_Crytpo_robomunication
  18. 选择H5响应式网站建设的主要原因
  19. 一根辣条铸就的百亿生意,卫龙是如何成龙的
  20. Verilog 实现占空比为50%的三分频 断言SVA查看波形

热门文章

  1. StackOverflow上87万访问量的问题:什么是“找不到符号”?
  2. javascript 编码_我们的1,600小时JavaScript编码课程
  3. 线性回归梯度下降py实现
  4. 操作Linux软链接引起的各种问题
  5. 输入法:QQ五笔输入法在Excel2010首次输入时,会在单元格内容产生一个空格
  6. 文件设置默认打开方式
  7. 海康视频H5插件 v2.0.0开发总结
  8. 华为 Telnet aaa认证模式
  9. ABAQUS应用中的小技巧
  10. python 提取元组中的值_如何从Python元组中提取数据?