java-final关键字修饰变量
在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关键字修饰变量相关推荐
- Java final关键字修饰变量Test
使用 final 关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的. package com.test; /*** final修饰一个变量练习* @author M ...
- 【Java面试题】3 Java中使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?超详细解析...
/* * 问题:使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变 * 答: * 使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以 ...
- 使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的.
- 用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变
使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变 答: 使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的. 代码 public ...
- java——final关键字、权限、内部类、引用类型
final关键字代表最终.不可改变的.常见四种用法: 1. 可以用来修饰一个类 2. 可以用来修饰一个方法 3. 还可以用来修饰一个局部变量 4. 还可以用来修饰一个成员变量 当final关键字用来修 ...
- Java——final关键字,String为什么不可变
目录 final是什么? 一.修饰类 二.修饰变量 三.修饰方法 String为什么不可变? 不知道大家有没有这样的疑问:我们在使用某些Java的类或者方法.属性(比如:String类)时,总是会发现 ...
- java final 关键字
java的final关键字 前言 final是 最终 的意思. 在java这门编程语言中,final是一个关键字,它可以被用来修饰类,变量以及成员方法. 被final修饰的变量,又叫被称为 自定义常量 ...
- final关键字修饰类,方法以及变量的特点 学习
A:final概述 B:final修饰特点 修饰类,类不能被继承 修饰变量,变量就变成了常量,只能被赋值一次 修饰方法,方法不能被重写 C:案例演示 final修饰特点 class Demo1_Fin ...
- 3.4—4 Java final关键字、接口、数组
文章目录 一.final 关键字 final修饰属性.方法.类 二.接口 (interface. implement) 1.什么是接口? 1)生活中的接口----USB接口 2)面向接口编程 3)接口 ...
最新文章
- NC45实现二叉树先序、中序和后序遍历
- Log4j源代码学习
- Android中悬浮窗口的实现原理和示例代码
- 【Python基础】14_Python中的TODO注释
- Spring MVC-10循序渐进之文件下载
- Refactor?or Patching?
- 利用Service Fabric承载eShop On Containers
- 【电路补习笔记】2、电容的参数与选型
- Maven详解及实例
- C++ 字符串流stringstream(附蓝桥杯2018年第九届真题缩位求和题解)
- 脚本语言(确认补遗)
- java字节型的关键字_DAY06-07 Java的基础语法-注释、标识符、关键字、数据类型
- 昨天又发火了:领导拒不给他人安排工作
- 单片机之硬件 软件仿真
- Prolog编程求解图搜索问题
- C#图片无损转换为ico格式
- BUUCTF_Crytpo_robomunication
- 选择H5响应式网站建设的主要原因
- 一根辣条铸就的百亿生意,卫龙是如何成龙的
- Verilog 实现占空比为50%的三分频 断言SVA查看波形