我们都知道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. Command Network OpenJ_Bailian - 3436(最小有向生成树模板题)

    链接: http://poj.org/problem?id=3164 题目: Command Network Time Limit: 1000MS   Memory Limit: 131072K To ...

  2. Django之CSS,JS静态文件的配置

    一. 专门创建一个目录放静态文件,即CSS,JS等. 1)先把jquery.min拿过来. 2)新建一个CSS文件放入样式 3)在login.html中引入.css文件 在login.html中引入. ...

  3. [BJWC2011]元素 线性基

    题面 题面 题解 一个方案合法,当且仅当选取的01串凑不出0. 因此就是要使得选取的01串全在线性基内,具体原因可以看这道题:[CQOI2013]新Nim游戏 线性基 要使得魔力值最大,只需要按法力值 ...

  4. 【HDU4689】Derangement(动态规划)

    [HDU4689]Derangement(动态规划) 题面 Vjudge 给定一个\(+-\)组成的字符串,长度为\(n\). 如果第\(i\)位是\(+\),那么\(p_i>i\),否则\(p ...

  5. BZOJ4070 [Apio2015]雅加达的摩天楼 【分块 + 最短路】

    题目链接 BZOJ4070 题解 考虑暴力建图,将每个\(B_i\)向其能到的点连边,复杂度\(O(\sum \frac{n}{p_i})\),当\(p\)比较小时不适用 考虑优化建图,每个\(dog ...

  6. Qt ------ 控件布局 setSizePolicy

    setSizePolicy 是设置控件在布局(layout)里面的大小变化的属性.如果控件没有在布局里,没什么用. 默认情况下,把 widget 放入 layout,widget 的大小一定程度上会随 ...

  7. array_diff使用注意

    $lost_ids = array_diff($all_ids,$old_ids); //array_diff,$old_ids不可以为null否则返回为null;array_diff起不到效果~~~

  8. SpringBoot (六) :如何优雅的使用 mybatis

    原文出处: 纯洁的微笑 这两天启动了一个新项目因为项目组成员一直都使用的是mybatis,虽然个人比较喜欢jpa这种极简的模式,但是为了项目保持统一性技术选型还是定了 mybatis.到网上找了一下关 ...

  9. springboot项目启动成功后执行一段代码的两种方式

    springboot项目启动成功后执行一段代码的两种方式 实现ApplicationRunner接口 package com.lnjecit.lifecycle; import org.springf ...

  10. 深入探索C++对象模型(七)

    站在对象模型的尖端(On the Cusp of the Object Model) Template 下面是有关template的三个主要讨论方向: template的声明,基本上来说就是当你声明一 ...