黑马程序员技术交流社区

标题: 【已解决】关于final关键字 [打印本页]

作者: 黄树人    时间: 2012-9-21 22:12
标题: 【已解决】关于final关键字
本帖最后由 黄树人 于 2012-9-22 11:00 编辑

使用final关键字修饰一个变量时,到底是指引用变量不能变,还是引用变量所指向的对象中的内容不能改变。
例如,对于如下语句:
final StringBuffer a=new StringBuffer("immutable");
执行如下语句将报告编译期错误:

     a=new StringBuffer("");
但是,执行如下语句则可以通过编译:

a.append(" broken!");
这是为什么呢?
还有在定义方法的参数时,可不可用采用如下形式来阻止方法内部修改传进来的参数对象:
public void method(final  StringBuffer  param)

{

}

求高手解释下这里面的原理



作者: 赵宇    时间: 2012-9-21 22:31

final StringBuffer a=new StringBuffer("immutable");
执行如下语句将报告编译期错误:

     a=new StringBuffer("");
但是,执行如下语句则可以通过编译:

a.append(" broken!"); 毫无疑问,引用所指向的地址不能变。
而对象的内容可以变。
public void method(final  StringBuffer  param)

{

}

第二个问题是不可以的
param 被final 修饰  虽然他指向的对象不能变  但是对象自身的内容可以变的

作者: 赵永康    时间: 2012-9-21 22:44
final StringBuffer a=new StringBuffer("immutable");  这句话意思是说你创建的这个字符串缓冲区不能变啦 就是a的指向不能变啦
a=new StringBuffer("");   这句话的意思是你创建了一个新的字符串缓冲区,并把它赋值给a  你意思就是让a重新指向,但是上句a已经不能改变了所以会报错
a.append(" broken!");    这句话的意思就是给你的创建的字符串缓冲区添加东西还是可以的
final是他的指向不能再改变了


  

作者: 陈振兴    时间: 2012-9-22 01:27
本帖最后由 陈振兴 于 2012-9-22 01:30 编辑

当利用final修饰一个属性(变量)的时候,此时的属性成为常量.
常量的地址不可改变,但在地址中保存的值(即对象的属性)是可以改变的。正如你的疑问一样,
final StringBuffer a=new StringBuffer("immutable");
执行如下语句将报告编译期错误:

    a=new StringBuffer("");//重新指向了一个引用,创建新的对象
但是,执行如下语句则可以通过编译:

a.append(" broken!"); 这就你是重新改变了SringBuffere的内容(视频中提到面盆原理),地址不会变的
而对象的内容可以变。

作者: 翁鹏    时间: 2012-9-22 08:17
final修饰引用类型的时候,只是保证了该引用不变,如果引用(即指针,地址)初始化了,那它就永远保持那个地址,那个地址指向的对象还是可以通过调用方法来改变它的状态。




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