我们都知道final修饰变量时 会变为常量,但是使 用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?

下面让我们来看这段代码:

  1. /**
  2. * 验证final修饰的变量是引用不能变,还是引用的对象不能变
  3. * StringBuilder 线程不安全 但速度快
  4. * 引用初始化以后不能被改变 --- 不是指变量的值不可变,而是指向的变量地址不可变
  5. * @author Tomato
  6. *
  7. */
  8. public class TestFinal {
  9. public static void main(String[] args) {
  10. final StringBuilder sb = new StringBuilder("haha");
  11. //同一对象的hashCode值相同
  12. System.out.println("sb中的内容是:"+sb);
  13. System.out.println(sb+"的哈希编码是:"+sb.hashCode());
  14. sb.append("我变了");
  15. System.out.println("sb中的内容是:"+sb);
  16. System.out.println(sb+"的哈希编码是:"+sb.hashCode());
  17. System.out.println("-----------------哈希值-------------------");
  18. TestFinal test = new TestFinal();
  19. System.out.println(test.hashCode());
  20. System.out.println(Integer.toHexString(test.hashCode()));
  21. System.out.println(test.getClass()+"@"+Integer.toHexString(test.hashCode()));
  22. System.out.println(test.getClass().getName()+"@"+Integer.toHexString(test.hashCode()));
  23. //在API中这么定义toString()等同于 getClass().getName() + '@' + Integer.toHexString(hashCode())
  24. //返回值是 a string representation of the object.
  25. System.out.println(test.toString());
  26. }
  27. }

代码结果是:

sb中的内容是:haha
haha的哈希编码是:1928052572
sb中的内容是:haha我变了
haha我变了的哈希编码是:1928052572
-----------------哈希值-------------------
1398828021
53606bf5
class TestFinal@53606bf5
TestFinal@53606bf5
TestFinal@53606bf5

可以看出StringBuilder中的内容变了 而所指向的哈希编码却没发生变化,在Java中每一个对象都有自己独一无二的哈希编码,根据这个编码就可以找到相关的对象,也就是说,根据这个编码你可以独一无二地确定这个对象。
因而使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。

总得来说对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。

2011-09-24 15:48 4607人阅读 评论(0) 收藏 举报
 分类:
java SE(28) 
  1. 1.import java.util.Random;
  2. 2.
  3. 3.//这个例子想说明一下static final 与 final的区别
  4. 4.public class StaticAndFinalTest {
  5. 5.
  6. 6.    private static Random rand = new Random(47); //47作为随机种子,为的就是产生随机数。
  7. 7.
  8. 8.    private final int a = rand.nextInt(20);
  9. 9.
  10. 10.    private static final int B = rand.nextInt(20);
  11. 11.
  12. 12.    public static void main(String[] args) {
  13. 13.        StaticAndFinalTest sf = new StaticAndFinalTest();
  14. 14.        System.out.println("sf : " + "a=" + sf.a);
  15. 15.        System.out.println("sf : " + "B=" + sf.B);
  16. 16.        System.out.println("------------------------------");
  17. 17.        StaticAndFinalTest sf1 = new StaticAndFinalTest();
  18. 18.        System.out.println("sf1 : " + "a=" + sf1.a);
  19. 19.        System.out.println("sf1 : " + "B=" + sf1.B);
  20. 20.    }
  21. 21.
  22. 22.}

运行结果:

  • sf : a=15
  • sf : B=18
  • --------------
  • sf1 : a=13
  • sf1 : B=18 

    可以看到,在sf和sf1对象中,a的值不是唯一的,但B的值是不会通过创建sf1对象而改变。这是因为它是static,在装载时已被初始化,而不是每次创建新对象时都初始化。

final修饰的变量是引用不能改变还是引用的对象不能改变的更多相关文章

  1. Java中Final修饰一个变量时,是引用不能变还是引用的对象不能变

    Java中,使用Final修饰一个变量,是引用不能变,还是引用对象不能变? 是引用对象的地址不能变,引用变量所指的对象的内容可以改变. final变量永远指向这个对象,是一个常量指针,而不是指向常量的 ...

  2. final修饰的变量引用不能变还是对象不可变

    两种情况:如果是基本数据类型,被final修饰的变量一旦初始化就不能改变:如果是引用数据类型的变量,初始化之后不能指向另外一个对象. 基本数据类型: package cn.yqg.day2; publ ...

  3. final修饰的变量是引用不能变还是对象的内容不能变?

    int a=1;此时a是变量: StringBuffer a=new StringBuffer();此时a就是引用变量,可以说是a引用String对象,通过a来操作String 对象 final St ...

  4. 浅谈final修饰的变量

    一直大概的知道final关键字的作用,但是自己实际工作中却很少用,除非在声明一些常量值的时候,今天忽然自己在项目中用一个map进行存储一些值.一开始我只是用private修饰的,心里想的是如果fina ...

  5. 并不是static final 修饰的变量都是编译期常量

    见代码 public class Test { public static void main(String[] args){ // 情况一 基本数据类型 //System.out.println(O ...

  6. final修饰的变量是引用不能改变,还是引用的对象不能改变???

    对于这个问题,我们不能只记结论,要拿实例说话,参看以下代码: public class Demo { public static void main(String[] args) { final St ...

  7. java基础 final 修饰成员变量 只能赋值一次问题

    final int a; public Fu(){ a=1; }

  8. static、final修饰的变量和方法能否被继承的问题

    首先定义父类和子类 public class Parent { protected static String a = "static"; final String b = &qu ...

  9. final修饰的类,其属性和方法默认是被final修饰的吗?

    在论坛上,看到一个问题,当然,各位聪明的客官想必已经知道问题是什么了,嘿嘿,没错就是文章的标题:final修饰的类,其属性和方法默认是被final修饰的吗? 老实说,刚开始看到这个问题的时候,有点懵. ...

随机推荐

  1. 题解 P1420 【最长连号】

    这个题过去的同学可以再来一题(P1567 统计天数): https://www.luogu.org/problemnew/show/P1567 是的,这个题其实也不是很难,就是前后比较,将天数压栈, ...

  2. linux系统常见命令以及操作

    2.安装xshell,安装完打开,配置回话,输入名称(随便).SSH.主机(打开linux,点击右上角电脑图标system etho进行联网,打开终端输入ifconfig回车,找到inet add地址 ...

  3. splay tree 学习笔记

    首先感谢litble的精彩讲解,原文博客: litble的小天地 在学完二叉平衡树后,发现这是只是一个不稳定的垃圾玩意,真正实用的应有Treap.AVL.Splay这样的查找树.于是最近刚学了学了点S ...

  4. Nowcoder 练习赛 23 D Where are you 解题报告

    Where are you 链接: https://ac.nowcoder.com/acm/contest/272/D 来源:牛客网 题目描述 小\(p\)和他的朋友约定好去游乐场游玩,但是他们到了游 ...

  5. linux内核分析 第二周 操作系统是如何工作的

    银雪纯 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.计算机是如何工作的 ...

  6. SQL注入(SQL Injection)案例和防御方案

    sql注入(SQL Injection):就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令. SQL注入攻击的主要危害包括:非法读取.篡 ...

  7. 解题:JLOI 2016 侦查守卫

    题面 经典的$cov-unc$树形dp(这词是你自己造的吧=.=) 设$cov[i][j]$表示覆盖完$i$的子树后至少向外再覆盖$j$层的最小代价,$unc[i][j]$表示$i$的子树中还剩下至少 ...

  8. day2-python基础

  9. 【数学】【CF27E】 Number With The Given Amount Of Divisors

    传送门 Description 给定一个正整数\(n\),输出最小的整数,满足这个整数有n个因子 Input 一行一个整数\(n\) Output 一行一个整数,代表答案. Hint \(1~\leq ...

  10. mybatis中的resultMap与resultType、parameterMap与 parameterType的区别

    Map:映射:Type:Java类型 resultMap 与 resultType.parameterMap 与  parameterType的区别在面试的时候被问到的几率非常高,项目中出现了一个小b ...