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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© zdf091119 中级黑马   /  2012-10-29 17:25  /  1705 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

书上说 final修饰的变量不变,这个变量不变时什么意思,我试了下
            
               public static void main(String args[]){

  
                   final StringBuffer a=new StringBuffer("abc");
                   final StringBuffer b=new StringBuffer("abc");
                               //   a=b;     这句编译失败的
                          System.out.print(a==b);
                            a.append(123);            //这句编译成功
             }
是不是final修饰的变量指向了一个 对象,那么就只能指向这个变量的地址值,变量的内容可以变?

评分

参与人数 1技术分 +1 收起 理由
谭立文 + 1

查看全部评分

3 个回复

倒序浏览
final修饰的引用型变量,变量的值是固定不变的,就是不可以再指向另外的对象了;
但是变量的属性值是可变的,就是对象的内容是可以变的。
例如你的例子:a = new StringBuffer("abc")这个对象被final修饰后引用值不变了,但是对象的内容能修改,因为它的属性值可以变。
在这里要注意区分对象的引用值和对象的属性值噢。

评分

参与人数 1技术分 +1 收起 理由
谭立文 + 1

查看全部评分

回复 使用道具 举报
final 修饰的变量,是说引用指向的内存地址不变。 而不是说,指向的对象是不可操作的。

评分

参与人数 1技术分 +1 收起 理由
谭立文 + 1

查看全部评分

回复 使用道具 举报
StringBuffer和String的区别就是在于String长度不可变,StringBuffer长度可变,而加上final表示引用的地址不能再发生变化,因为StringBuffer可以再原来引用地址的基础上加内容,所以a.append("123"),编译成功。而a=b,相当于要把b的引用指向a,就是要更改a的引用地址,所以编译失败

评分

参与人数 1技术分 +1 收起 理由
谭立文 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马