黑马程序员技术交流社区

标题: 【问题已解决】关于StringBuffer的小问题 [打印本页]

作者: 刘悦    时间: 2012-8-8 16:50
标题: 【问题已解决】关于StringBuffer的小问题
本帖最后由 刘悦 于 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的不可变性只对引用的内存地址有效?

求解求解~~~各位大哥大姐,小弟求解~~~请各抒己见,不要吝惜您的观点,小弟先谢过了~
  问题已解决,谢谢各位童鞋的解答
作者: 刘悦    时间: 2012-8-8 17:45
在线求助,虚心求教,请各位大哥大姐不吝赐教,小弟在此先谢过
作者: 杨文宇    时间: 2012-8-8 17:48
//这是张孝祥老师的java就业面试题的原话,讲得很清楚了,
使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。例如,对于如下语句:
final StringBuffer a=new StringBuffer("immutable");
执行如下语句将报告编译期错误:
a=new StringBuffer("");
但是,执行如下语句则可以通过编译:
a.append(" broken!");

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



作者: hello world    时间: 2012-8-8 18:21
其实兄台你已经明白了,我这说都多余。引用变量,记住的就是对象的地址值,而我们说的final关键字   final修饰的变量 我们只能赋值一次   而他的值就是最初赋给他的对象的地址值。所以就不能再赋给他其他对象的地址值了。

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

final.JPG

作者: 刘悦    时间: 2012-8-8 18:29
十分感谢!!!三位大哥的分析很到位,刘向阳同学,图很给力啊!!!
作者: 杨震    时间: 2012-8-8 18:37
final修饰的引用值不能变,但引用指向的对象可以改变




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2