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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 杨增坤 于 2013-11-1 15:12 编辑

final关键字修饰一个变量的疑问

例如:

final StringBuffer a=new StringBuffer("abc");
a.append(" def");

执行上面语句不会报错,而且会打印出abcdef。为什么?final不是不可修改么

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

5 个回复

倒序浏览
这个是堆栈的问题吧,final 表示锁定当前地址,
StringBuffer重写了toString不好举例子,你自己写一个类,
然后在main里实例化然后打印对象本身  ~~  main{ Preson p = new Person(); p.setName("..."); syso(p); }
然后更改对象的属性再输出 ~~  { p.setName{"..."}; p.setGender{"..."}; syso(p); }
输出的结果是没变的,final 锁定的就是输出的那个东西
回复 使用道具 举报
StringBuffer是字符串缓冲区
是一个容器
1:而且长度是可变化的
2:可以操作多个数据类型
3:最终会通过toString方法变成字符串。
它就像一个盆,你往里边添加东西,或者移除东西,但是这个盆的属性它是不会变化的。这也是对象属性改变后结果没变的原因。final 表示锁定当前地址。具体你可以查看老毕第十三天第11课时StringBuffer的视频。希望可以帮到你。
回复 使用道具 举报
final关键字
        (1)最终的意思,可以用于修饰类,方法,变量。
        (2)final修饰的类不能被继承。
           final修饰的方法不能被重写。
           final修饰的变量是一个常量。只能被赋值一次。
           内部类只能访问被final修饰的局部变量。
回复 使用道具 举报
使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。例如,对于如下语句:
final StringBuffer a=new StringBuffer("immutable");
执行如下语句将报告编译期错误:
a=new StringBuffer("");
但是,执行如下语句则可以通过编译:
a.append(" broken!");

有人在定义方法的参数时,可能想采用如下形式来阻止方法内部修改传进来的参数对象:
        public void method(final  StringBuffer  param)
        {
        }
实际上,这是办不到的,在该方法内部仍然可以增加如下代码来修改参数对象:
                param.append("a");



这是张老师面试宝典里面的内容,说的很明白了 希望对你有帮助

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

回复 使用道具 举报
To 金牌黑马 2013-10-30 00:04:53
地板
楼主你好,如果问题已解决请将帖子状态修改为提问结束,
如果未解决请继续追问,谢谢合作
修改方法请看解释帖:http://bbs.itheima.com/thread-89313-1-1.html
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马