对于这个问题,我们不能只记结论,要拿实例说话,参看以下代码:

public class Demo {    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("-----------------哈希值-------------------");        Demo test = new Demo();        System.out.println(test.hashCode());        System.out.println(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的哈希编码是:396873410
sb中的内容是:haha我变了
haha我变了的哈希编码是:396873410
-----------------哈希值-------------------
1706234378
65b3120a
demo1.Demo@65b3120a
demo1.Demo@65b3120a

分析结果,两次的hashCode都是一样的,表示引用变量没变,引用变量所指向的对象中的内容还是可以改变的

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

-----------------------------------------

例如,对于如下语句:
final StringBuffer a = new StringBuffer("immutable");
执行如下语句将报告编译期错误:
a = new StringBuffer("");
但是,执行如下语句则可以通过编译:
a.append("broken!");
有人在定义方法的参数时,可能想采用如下形式来阻止方法内部修改传进来的参数对象:
public void method(final StringBuffer param)
{
}
实际上,这是办不到的,在该方法内部仍然可以增加如下代码来修改参数对象:
param.append("a");这是因为变量param的引用并没有变化,所以是不会出错的。

但是下面的就会出错了,因为int类型的数据是直接放在了栈内存当中的,它不需要想对象一样需要有一个引用,如果

修改了x就是修改了引用,所以如果修改了x那么就会出错。

public int addOne(final int x) {
 return x++;
 }

又比如如下的例子:

public class Something{
public static void main(String[] args) {
Other o = newOther();
new Something().addOne(o);
}
public void addOne(final Other o) {
o.i++;
}
}
class Other {
public int i;
}

这个在编译的时候也是不会出错的,因为这个时候修改的不是对象的引用而是对象的属性,因为只有对象是final类型的,所以只要不去修改对象就不会出现错误的。

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

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

    我们都知道final修饰变量时 会变为常量,但是使 用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变? 下面让我们来看这段代码: /** * 验证final修饰的变量是引用不能变, ...

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

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

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

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

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

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

  5. 浅谈final修饰的变量

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

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

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

  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. 数据挖掘算法(四)Apriori算法

    参考文献: 关联分析之Apriori算法

  2. python的string用法

    s.strip().lstrip().rstrip(',') S.lower() #小写 S.upper() #大写 S.swapcase() #大小写互换 S.capitalize() #首字母大写 ...

  3. js 在页面上模拟多选,蚂蚁线线框

    <html> <head></head> <style> body{padding-top:50px;padding-left:100px;paddin ...

  4. 字符串0.在php和js中转换为布尔类型 值是false还是true

    在php 中 $a = '0'; $b = (bool)$a; var_dump($a);//输出false 在js中官方说明: Note:If the value parameter is omit ...

  5. 安装自创建的windows服务。

    安装自创建的windows服务. 使用工具InstallUtil.exe进行安装和卸载创建的windows服务 安装:C:/WINDOWS/Microsoft.NET/Framework/v2.0.5 ...

  6. maven+springmvc+spring+mybatis+velocity整合

      一.ssmm简介 ssmm是当下企业最常用的开发框架架构 maven:管理项目jar包,构建项目 spring:IOC容器,事务管理 springmvc:mvc框架 myBatis:持久层框架 v ...

  7. 做App还是微信公众号,你该如何抉择?

    我不够聪明,因为我经常出于好奇被自己提出的问题所困扰,于是乎就有些强迫症似的拼命去寻求答案——我只是想说服自己,让自己从困扰的谜团中清醒.坚定方向,进而能从容不迫的走下去... 最近在考虑一个问题:做 ...

  8. sphinx全文检索功能 | windows下测试 (一)

    前一阵子尝试使用了一下Sphinx,一个能够被各种语言(PHP/Python/Ruby/etc)方便调用的全文检索系统.网上的资料大多是在linux环境下的安装使用,当然,作为生产环境很有必要部署在* ...

  9. Spring事务管理器的应对

    Spring抽象的DAO体系兼容多种数据访问技术,它们各有特色,各有千秋.像Hibernate是非常优秀的ORM实现方案,但对底层SQL的控制不太方便:而iBatis则通过模板化技术让你方便地控制SQ ...

  10. 新手要想学好Linux系统就必须做好这四件事情

    一般情况下,大部分人接触Linux的机会并不多,对Linux平台下的开发更是一无所知.而现在的发展趋势却越来越表明:无论是作为一个优秀的软件开发人员,或是互联网.IT行业的从业人员,掌握Linux是一 ...