final修饰的变量是引用不能改变还是引用的对象不能改变
我们都知道final修饰变量时 会变为常量,但是使 用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
下面让我们来看这段代码:
- /**
- * 验证final修饰的变量是引用不能变,还是引用的对象不能变
- * StringBuilder 线程不安全 但速度快
- * 引用初始化以后不能被改变 --- 不是指变量的值不可变,而是指向的变量地址不可变
- * @author Tomato
- *
- */
- public class TestFinal {
- public static void main(String[] args) {
- final StringBuilder sb = new StringBuilder("haha");
- //同一对象的hashCode值相同
- System.out.println("sb中的内容是:"+sb);
- System.out.println(sb+"的哈希编码是:"+sb.hashCode());
- sb.append("我变了");
- System.out.println("sb中的内容是:"+sb);
- System.out.println(sb+"的哈希编码是:"+sb.hashCode());
- System.out.println("-----------------哈希值-------------------");
- TestFinal test = new TestFinal();
- System.out.println(test.hashCode());
- System.out.println(Integer.toHexString(test.hashCode()));
- System.out.println(test.getClass()+"@"+Integer.toHexString(test.hashCode()));
- System.out.println(test.getClass().getName()+"@"+Integer.toHexString(test.hashCode()));
- //在API中这么定义toString()等同于 getClass().getName() + '@' + Integer.toHexString(hashCode())
- //返回值是 a string representation of the object.
- System.out.println(test.toString());
- }
- }
代码结果是:
sb中的内容是:haha
haha的哈希编码是:1928052572
sb中的内容是:haha我变了
haha我变了的哈希编码是:1928052572
-----------------哈希值-------------------
1398828021
53606bf5
class TestFinal@53606bf5
TestFinal@53606bf5
TestFinal@53606bf5
可以看出StringBuilder中的内容变了 而所指向的哈希编码却没发生变化,在Java中每一个对象都有自己独一无二的哈希编码,根据这个编码就可以找到相关的对象,也就是说,根据这个编码你可以独一无二地确定这个对象。
因而使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。
总得来说对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。

- 1.import java.util.Random;
- 2.
- 3.//这个例子想说明一下static final 与 final的区别
- 4.public class StaticAndFinalTest {
- 5.
- 6. private static Random rand = new Random(47); //47作为随机种子,为的就是产生随机数。
- 7.
- 8. private final int a = rand.nextInt(20);
- 9.
- 10. private static final int B = rand.nextInt(20);
- 11.
- 12. public static void main(String[] args) {
- 13. StaticAndFinalTest sf = new StaticAndFinalTest();
- 14. System.out.println("sf : " + "a=" + sf.a);
- 15. System.out.println("sf : " + "B=" + sf.B);
- 16. System.out.println("------------------------------");
- 17. StaticAndFinalTest sf1 = new StaticAndFinalTest();
- 18. System.out.println("sf1 : " + "a=" + sf1.a);
- 19. System.out.println("sf1 : " + "B=" + sf1.B);
- 20. }
- 21.
- 22.}
运行结果:
- sf : a=15
- sf : B=18
- --------------
- sf1 : a=13
- sf1 : B=18
可以看到,在sf和sf1对象中,a的值不是唯一的,但B的值是不会通过创建sf1对象而改变。这是因为它是static,在装载时已被初始化,而不是每次创建新对象时都初始化。
final修饰的变量是引用不能改变还是引用的对象不能改变的更多相关文章
- Java中Final修饰一个变量时,是引用不能变还是引用的对象不能变
Java中,使用Final修饰一个变量,是引用不能变,还是引用对象不能变? 是引用对象的地址不能变,引用变量所指的对象的内容可以改变. final变量永远指向这个对象,是一个常量指针,而不是指向常量的 ...
- final修饰的变量引用不能变还是对象不可变
两种情况:如果是基本数据类型,被final修饰的变量一旦初始化就不能改变:如果是引用数据类型的变量,初始化之后不能指向另外一个对象. 基本数据类型: package cn.yqg.day2; publ ...
- final修饰的变量是引用不能变还是对象的内容不能变?
int a=1;此时a是变量: StringBuffer a=new StringBuffer();此时a就是引用变量,可以说是a引用String对象,通过a来操作String 对象 final St ...
- 浅谈final修饰的变量
一直大概的知道final关键字的作用,但是自己实际工作中却很少用,除非在声明一些常量值的时候,今天忽然自己在项目中用一个map进行存储一些值.一开始我只是用private修饰的,心里想的是如果fina ...
- 并不是static final 修饰的变量都是编译期常量
见代码 public class Test { public static void main(String[] args){ // 情况一 基本数据类型 //System.out.println(O ...
- final修饰的变量是引用不能改变,还是引用的对象不能改变???
对于这个问题,我们不能只记结论,要拿实例说话,参看以下代码: public class Demo { public static void main(String[] args) { final St ...
- java基础 final 修饰成员变量 只能赋值一次问题
final int a; public Fu(){ a=1; }
- static、final修饰的变量和方法能否被继承的问题
首先定义父类和子类 public class Parent { protected static String a = "static"; final String b = &qu ...
- final修饰的类,其属性和方法默认是被final修饰的吗?
在论坛上,看到一个问题,当然,各位聪明的客官想必已经知道问题是什么了,嘿嘿,没错就是文章的标题:final修饰的类,其属性和方法默认是被final修饰的吗? 老实说,刚开始看到这个问题的时候,有点懵. ...
随机推荐
- 洛谷 P1352 没有上司的舞会
树形动规入门题 先放题面 题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.现在有个周年庆宴会,宴会每邀请来一个职员都 ...
- C++解析(13):临时对象与const对象
0.目录 1.临时对象 2.const对象 3.类成员 4.小结 1.临时对象 一个有趣的问题--下面的程序输出什么?为什么? #include <stdio.h> class Test ...
- C 类网络的子网快速划分
CIDR ( Classless Inter-Domain Routing ,无类域间路由选择) 进行子网划分的方法有很多,最适合你的方式就是正确的方式.在 C 类地址中,只有 8 位用于定义主机.注 ...
- 待续--mysql中key 、primary key 、unique key 与index区别
mysql中key .primary key .unique key 与index区别
- Netsh命令-修改网络IP设置
原文链接地址:https://blog.csdn.net/qq_38054198/article/details/77990914 静态设置IP 修改IP地址addr和子网掩码mask: \>n ...
- 洛谷P2398 GCD SUM
题目描述 for i=1 to n for j=1 to n sum+=gcd(i,j) 给出n求sum. gcd(x,y)表示x,y的最大公约数. 输入输出格式 输入格式: n 输出格式: sum ...
- 2018-2019 ACM-ICPC 沈阳赛区 K. Let the Flames Begin
K. Let the Flames Begin 题目链接:https://codeforces.com/gym/101955/problem/K 题意: n个人围成一个圈,然后依次从1开始报数,报到k ...
- JAX-WS搭建WebService和客户端访问程序
开发环境:myeclipse8.6+jdk1.6.0_29+tomcat6.0.37 XFire搭建webservice: http://www.cnblogs.com/gavinYang/p/352 ...
- goaccess日志分析
对于nginx日志分析,有很多工具,衡量好坏的标准大概就是三快:安装快,解析快,上手快.满足这三点的goaccess确实是居家必备良药. 话说这个标题其实有点委屈GoAccess了,它是一个日志分析工 ...
- 动态规划:插头DP
这种动归有很多名字,插头DP是最常见的 还有基于连通性的动态规划 轮廓线动态规划等等 超小数据范围,网格图,连通性 可能算是状态压缩DP的一种变式 以前我了解的状压DP用于NP难题的小数据范围求解 这 ...