黑马程序员技术交流社区

标题: 关于final的问题 [打印本页]

作者: 381946250    时间: 2013-5-28 17:37
标题: 关于final的问题
本帖最后由 381946250 于 2013-5-29 11:49 编辑

在定义方法的参数时,使用如下形式


public void method(final  StringBuffer  param)
{

}

想阻止方法内部修改传进来的参数对象,
为什么不可以?


final修饰一个变量时,到底是引用不能变,还是引用的对象不能变?
作者: FantasticPie    时间: 2013-5-28 17:48
本帖最后由 FantasticPie 于 2013-5-28 17:50 编辑

就对于这个题目而言,外部传进这个方法的只要是StringBuffer的对象都是可以的,比如传入一个new StringBuffer("a"),或者传入一个new StringBuffer("b"),这都是可以的。关键是在method的方法内的param是不能改变的,比如在方法内定义 param = new StringBuffer(),就是不允许的。
作者: 顾玲玉    时间: 2013-5-28 18:18
对于引用类型的变量而言,它保存的仅仅是一个引用,final只保证这个引用所引用的地址不会改变,即一直引用同一个对象,但这个对象完全可以改变,
public  class  TestFinal
{
public  static  void  main(String[]  args)
{
final  int[] iArr = {5,6,12,9};
System.out.println(Arrays.toString(iArr));
iArr[2] = 4;   //这个语句是合法的,对数组元素重新赋值
System.out.println(Arrays.toString(iArr));
iArr = null;  //这个语句是不合法的,因为其对iArr重新赋值

}
}
由此可以看出,使用final修饰的引用类型变量不能被重新赋值,但可以改变引用类型变量所引用对象的内容。
作者: 紫衣侯    时间: 2013-5-28 18:26
final只能保证引用永远指向固定对象,不能保证那个对象的状态不变
作者: 381946250    时间: 2013-5-29 11:49
这个关键字的用法太让人纠结啦,谢谢大家的回答,明白了!我再敲一敲!




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