我们都知道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. OSPF协议介绍及配置 (上)

    OSPF协议介绍及配置 (上) 一.OSPF概述 回顾一下距离矢量路由协议的工作原理:运行距离矢量路由协议的路由器周期性的泛洪自己的路由表,通过路由的交互,每台路由器都从相邻的路由器学习到路由,并且加 ...

  2. 【BZOJ1068】压缩(动态规划)

    [BZOJ1068]压缩(动态规划) 题面 BZOJ 洛谷 题解 比较简单的\(dp\) 设\(f[i][j]\)表示当前已经匹配到了原串的第\(i\)个位置,上一个\(M\)在第\(j\)个字符之后 ...

  3. 51NOD 1559:车和矩形——题解

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1559 波雷卡普有一个n×m,大小的棋盘,上面有k个车.他又放了q个矩形在 ...

  4. 洛谷 P3157 [CQOI2011]动态逆序对 解题报告

    P3157 [CQOI2011]动态逆序对 题目描述 对于序列\(A\),它的逆序对数定义为满足\(i<j\),且\(A_i>A_j\)的数对\((i,j)\)的个数.给\(1\)到\(n ...

  5. 洛谷 P1233 木棍加工 解题报告

    P1233 木棍加工 题目描述 一堆木头棍子共有n根,每根棍子的长度和宽度都是已知的.棍子可以被一台机器一个接一个地加工.机器处理一根棍子之前需要准备时间.准备时间是这样定义的: 第一根棍子的准备时间 ...

  6. position:fixed 相对父元素定位

    position:fixed是对于浏览器窗口定位的,要实现相当于父元素定位,可以这样: 不设置fixed元素的top,bottom,left,right,只设置margin来实现. 这种方法本质上fi ...

  7. Python3 字典 pop() 方法

     Python3 字典 描述 Python 字典 pop() 方法删除字典给定键 key 所对应的值,返回值为被删除的值.key值必须给出. 否则,返回default值. 语法 pop()方法语法: ...

  8. mysql四-2:多表查询

    一 介绍 本节主题 多表连接查询 复合条件连接查询 子查询 准备表 #建表 create table department( id int, name varchar(20) ); create ta ...

  9. portal商品展示功能逻辑

    看下接口: 返回值: 门户商品搜索功能的实现: 根据分类id进行搜索,根据关键词进行搜索,并按照一定的顺序排序 业务逻辑: 1.查询分类是否存在. 2.如果分类存在,则递归分类,展示父类商品,子类商品 ...

  10. 把一个文件中所有文件名或者文件路径读取到一个txt文件,然后在matlab中读取

    链接: http://blog.csdn.net/dreamgchuan/article/details/51113295 dir /on/b/s  这个读取的是这样的格式: