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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 戎石锁 中级黑马   /  2012-8-20 21:48  /  1694 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 戎石锁 于 2012-8-21 22:22 编辑

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


public void method(final  StringBuffer  param)
{

}

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


final修饰一个变量时,到底是引用不能变,还是引用的对象不能变?

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

2 个回复

倒序浏览
是引用不能变,不是引用所指的对象,所以你那个传参是不行的,因为传参传的是对象的引用,是引用赋值,引用参数必然变了,我是这样想的,没像你那样做过,C++里面可以阻止方法内部修改传进来的参数对象
回复 使用道具 举报
本帖最后由 陈鑫 于 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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马