黑马程序员技术交流社区

标题: final [打印本页]

作者: zdf091119    时间: 2012-10-29 17:25
标题: final
书上说 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修饰的变量指向了一个 对象,那么就只能指向这个变量的地址值,变量的内容可以变?

作者: 周万谋    时间: 2012-10-29 17:38
final修饰的引用型变量,变量的值是固定不变的,就是不可以再指向另外的对象了;
但是变量的属性值是可变的,就是对象的内容是可以变的。
例如你的例子:a = new StringBuffer("abc")这个对象被final修饰后引用值不变了,但是对象的内容能修改,因为它的属性值可以变。
在这里要注意区分对象的引用值和对象的属性值噢。
作者: 毕影彬    时间: 2012-10-29 17:51
final 修饰的变量,是说引用指向的内存地址不变。 而不是说,指向的对象是不可操作的。
作者: 李靖    时间: 2012-10-29 18:01
StringBuffer和String的区别就是在于String长度不可变,StringBuffer长度可变,而加上final表示引用的地址不能再发生变化,因为StringBuffer可以再原来引用地址的基础上加内容,所以a.append("123"),编译成功。而a=b,相当于要把b的引用指向a,就是要更改a的引用地址,所以编译失败




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