我们都知道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. DNA Sequence POJ - 2778 (ac自动机 + 快速幂)

    题意: 给出患病的DNA序列,问序列长度为n的,且不包含患病的DNA序列有多少种 解析: 以给出的患病DNA序列建trie树  患病结点要用flag标记 对于长度为n的序列 位置i有四种 情况A  C ...

  2. 解决Maven下载依赖慢

    微服务spring boot,在使用maven下载依赖的时候非常慢,几十K的依赖JAR,也需要漫长的等待,更悲剧呢的漫长等待结果提示下载失败,为彻底解决这个问题,决定使用国内的镜像库,想象总是美好的, ...

  3. python基础(5)

    使用dict和set dict Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度. 举个例子 ...

  4. 【数学】【P5076】 Tweetuzki 爱整除

    Description 对于一个数 \(k\),找到任意一个 \(x\),满足 \(0~\leq~k~\leq~x~\leq~10^{18}\) 且对于任意一个 \(x\) 进制数,把该数字各数位上的 ...

  5. c++常量详解

    概念 常量是存放固定且不可变值的,一旦确定初始值则在程序其它地方不可改变, 所以const对象必须初始化.常量一般使用const关键字来修饰. const 对象可以大致分为三类: 1. const i ...

  6. 批量修改历史commit的用户名user.name邮箱user.email

    配置当前的用户名邮箱可以当前项目配置或者全局配置. 仅当前项目配置: git config user.name 'your-user-name' git config user.email 'your ...

  7. 手脱FSG v1.33

    1.载入PEID FSG v1.33 (Eng) -> dulek/xt 2.载入OD,先F8跟一会 004103E3 > BE A4014000 mov esi,fsg1_33.0040 ...

  8. .Net并行编程之二:并行循环

    本篇内容主要包括: 1.能够转化为并行循环的条件 2.并行For循环的用法:Parallel.For 3.并行ForEach的用法Parallel.ForEach 4.并行LINQ(PLINQ)的用法 ...

  9. 基于javaWeb阶段下的Servlet总结

    1. Servlet概述   Servlet是用Java语言编写的服务端的程序,采用request--response模式提供Web服务,并且支持标准ServletAPI,Servlet就一个运行在w ...

  10. python---twisted的使用,使用其模拟Scrapy

    twisted的网络使用 twisted的异步使用 一:简单使用 from twisted.internet import defer from twisted.web.client import g ...