A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘悦 中级黑马   /  2012-8-8 16:50  /  1585 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 刘悦 于 2012-8-8 18:48 编辑
  1. final StringBuffer a = new StringBuffer("111");
  2.   final StringBuffer b = new StringBuffer("222");
  3.   a=b;
复制代码
上面这句到a=b明显会编译失败,而下面则会编译成功
  1. final StringBuffer a = new StringBuffer("111");
  2.   a.append("222");
复制代码
这是为什么?老师以前说过FINAL定义的变量不是不可变的么?难道final的不可变性只对引用的内存地址有效?

求解求解~~~各位大哥大姐,小弟求解~~~请各抒己见,不要吝惜您的观点,小弟先谢过了~
  问题已解决,谢谢各位童鞋的解答

评分

参与人数 1技术分 +1 收起 理由
包晗 + 1

查看全部评分

6 个回复

倒序浏览
在线求助,虚心求教,请各位大哥大姐不吝赐教,小弟在此先谢过
回复 使用道具 举报
//这是张孝祥老师的java就业面试题的原话,讲得很清楚了,
使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。例如,对于如下语句:
final StringBuffer a=new StringBuffer("immutable");
执行如下语句将报告编译期错误:
a=new StringBuffer("");
但是,执行如下语句则可以通过编译:
a.append(" broken!");

评分

参与人数 1技术分 +1 收起 理由
包晗 + 1

查看全部评分

回复 使用道具 举报
同意楼上的解释,final修饰变量,指的是变量的引用不变
final StringBuffer a = new StringBuffer("111");
a.append("222");
append()返回的是该对象的一个引用,还是之前定义的,没有改变。
查询API,看看官方解释:
StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符添加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。


回复 使用道具 举报
其实兄台你已经明白了,我这说都多余。引用变量,记住的就是对象的地址值,而我们说的final关键字   final修饰的变量 我们只能赋值一次   而他的值就是最初赋给他的对象的地址值。所以就不能再赋给他其他对象的地址值了。

final.JPG (31.85 KB, 下载次数: 11)

final.JPG

评分

参与人数 1技术分 +1 收起 理由
包晗 + 1

查看全部评分

回复 使用道具 举报
十分感谢!!!三位大哥的分析很到位,刘向阳同学,图很给力啊!!!
回复 使用道具 举报
final修饰的引用值不能变,但引用指向的对象可以改变
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马