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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 lvwenwen88 于 2012-1-15 21:41 编辑

使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?

11 个回复

倒序浏览
使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。例如,对于如下语句:
final StringBuffer a=new StringBuffer("immutable");
执行如下语句将报告编译期错误:
a=new StringBuffer("");
但是,执行如下语句则可以通过编译:
a.append(" broken!");

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

评分

参与人数 1技术分 +2 收起 理由
admin + 2

查看全部评分

回复 使用道具 举报
应该是引用不变,也就是引用指向指定的对象,不能再指向其它的对象。至于对象中的值还是可以改变的,因为final关心的是地址,而不是对象当中的值。
回复 使用道具 举报
final 对于常量来说,意味着值不能改变,例如 final int i=100。这个i的值永远都是100。但是对于变量来说又不一样,只是标识这个引用不可被改变,例如 final File f=new File("c:\\test.txt");那么这个f一定是不能被改变的,如果f本身有方法修改其中的成员变量,例如是否可读,是允许修改的。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
朱泽宇 发表于 2012-1-10 23:01
使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。例如 ...

谢谢,非常详细,学习了
回复 使用道具 举报
本帖最后由 代臣 于 2012-1-11 12:49 编辑

你所问的变与不变比较模糊,比如“被final修饰的类不可以被继承”这个地方就没有什么变与不变的问题啊...,应该视具体情况决定。
按理解给出final的用法:
final可以修饰类、函数、变量。
1.被final修饰的类不可以被继承。—>这个地方没有什么变不变的问题,就是不可以继承。
2.被final修饰的方法不可以被复写(也就是重写、覆盖)。—>这个地方是方法根本就不让复写,也没有什么变不变的问题。
3.被final修饰的变量是一个常量,只能赋值一次,final既可以修饰成员变量,又可以修饰局部变量。—>这个地方是final修饰的变量是常量,内存中的变量的值不能再改变,视作常量。
比如定义了局部变量y:
final int y = 1;
y = 2;//由3知这个地方就是错误的。
希望对你有用。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
杨扬 黑马帝 2012-1-11 11:56:30
7#
引用变量不能变,
下面这个样子是可以的
final int[] a = { 2, 3, 2, 3 };
a[1]=44;

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
zl918 黑马帝 2012-1-11 12:36:59
8#
本帖最后由 zl918 于 2012-1-11 12:37 编辑

如果final修饰的是一个基本类型,就表示这个变量被赋予的值是不可变的,即它是个常量;如果final修饰的是一个对象,就表示这个变量被赋予的引用是不可变的,这里需要注意的是,不可改变的只是这个变量所保存的引用,并不是这个引用所指向的对象。在第二种情况下,final的含义与第一种情况相同。实际上对于前两种情况,有一种更贴切的表述final的含义的描述,那就是,如果一个变量或方法参数被final修饰,就表示它只能被赋值一次,但是JAVA虚拟机为变量设定的默认值不记作一次赋值。
  被final修饰的变量必须被初始化。初始化的方式有以下几种:
  在定义的时候初始化。 final变量可以在初始化块中初始化,不可以在静态初始化块中初始化。 静态final变量可以在静态初始化块中初始化,不可以在初始化块中初始化。 final变量还可以在类的构造器中初始化,但是静态final变量不可以。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
大梅 黑马帝 2012-1-11 13:33:41
9#
是引用指向不能变,而指向的东西里面的内容是可以变的
回复 使用道具 举报
王杰 黑马帝 2012-1-11 13:36:11
10#
使用final 时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改
变的。
比如:final StringBuffer a=new StringBuffer("abcde");
执行如下语句将报告编译期错误:
a=new StringBuffer("");
但是,执行如下语句则可以通过编译:
a.append(" aabce");

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
当你在类中定义变量时,在其前面加上final关键字,对基本类型来说是其值不可变,而对于对象变量来说其引用不可再变,但引用变量所指向的对象中的内容还是可以改变的。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

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