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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 孙天 黑马帝   /  2012-4-27 23:30  /  1585 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


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

5 个回复

倒序浏览
final 修饰类:当一个类被final 所修饰时,表示该类是一个终态类,即不能被继承。
final StringBuffer a=new StringBuffer("immutable");
对象a的内存地址不也能变,所以执行a=new StringBuffer("");这个语句时报错
而执行a.append(" broken!"); 编译通过,是因为对象a的内存地址不变
回复 使用道具 举报
是引用的对象不能变,对于对象句柄,final会讲句柄变成一个常数,进行声明时,必须将句柄初始化到一个具体的对象,而且永远不能将句柄指向另一个对象,但是对象本身是可以修改的,final StringBuffer a=new StringBuffer("immutable");这句话写了后,a已经指向了一个对象,而a=new StringBuffer("");这句话使a指向了另一个对象,就会报错,但是a.append(" broken!");只是修改对象本身,所以是可以的
回复 使用道具 举报
显然是引用关系不可变,即引用变量不可变。
当创建一个对象时,jvm会在栈内存中会用一个变量去记住对象的地址。当你用final去修饰这个变量,说明这个变量承载的地址不可变了。
而a.append(" broken!"); 是修改对象的属性,所以不报错
回复 使用道具 举报
引用对象的地址不变,你列子已经说明了这个事实,new是创建新对象,而前面的变量已经被final修饰了,在为其赋值不合法,
回复 使用道具 举报

首先简单理解啊,比如final int X = 6;之后X还能被赋值吗?显然是不能的。原因就是final修饰的变量必须在定义时就被初始化。对于final修饰的对象引用当然也只能被赋值一次啦
所以final StringBuffer a=new StringBuffer("immutable")中的a不能再被赋值。

当然实质上,final 修饰的是 一个对象的引用,引用中存放的是一个地址值,所以当然是a中存放的地址不能改变,即a不能再指向StringBuffe的其他对象,而a当然可以调用自己的公有成员方法a.append(" broken!");类虽然发生了变化,但a中地址并没有改变
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马