黑马程序员技术交流社区

标题: 关于final(问题已解决,谢谢各位) [打印本页]

作者: 戎石锁    时间: 2012-8-20 21:48
标题: 关于final(问题已解决,谢谢各位)
本帖最后由 戎石锁 于 2012-8-21 22:22 编辑

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


public void method(final  StringBuffer  param)
{

}

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


final修饰一个变量时,到底是引用不能变,还是引用的对象不能变?
作者: 杨震    时间: 2012-8-20 21:53
是引用不能变,不是引用所指的对象,所以你那个传参是不行的,因为传参传的是对象的引用,是引用赋值,引用参数必然变了,我是这样想的,没像你那样做过,C++里面可以阻止方法内部修改传进来的参数对象
作者: 陈鑫    时间: 2012-8-20 22:08
本帖最后由 陈鑫 于 2012-8-20 23:34 编辑

public void method(final  StringBuffer  param)
{

}

这种方式没有问题啊,当函数参数为final类型时,你可以读取使用该参数,但是无法改变该参数的值。
final修饰的变量是不可变的,即不可被重新赋值
而其变量引用的对象中的数据是可变的
  1. public class TestFinal {
  2.         final Exam exam = new Exam();
  3.         public static void main(String[] args) {
  4.                 TestFinal t = new TestFinal();
  5.                 //final修饰的变量是不可变的,即不可被重新赋值
  6.                 //而其变量引用的对象中的数据是可变的,下面就成功对对象exam中的a属性重新赋值
  7.                 t.exam.setA("a");
  8.                 System.out.println(t.exam.getA());
  9.                
  10.                 //下面注释起来的这句就报错,因为被final修饰的变量不可被重新赋值
  11.                 //t.exam =  new Exam();
  12.         }
  13. }
  14. class Exam{
  15.         private String a;
  16.         public String getA() {
  17.                 return a;
  18.         }
  19.         public void setA(String a) {
  20.                 this.a = a;
  21.         }
  22.         
  23. }
复制代码





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