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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 徐西宏 黑马帝   /  2011-9-26 09:32  /  1791 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

final修饰的变量不变,
但是final修饰的对象型变量是引用本身的不变,还是引用指向的对象不变?
求解释

3 个回复

倒序浏览
黑马网友  发表于 2011-9-26 09:47:16
沙发
用final修饰的变量只赋值一次
回复 使用道具 举报
用于对象引用,final使引用恒定不变,一旦引用被初始化指向一个对象,就无法再把它改为指向另一个对象,然而对象其自身是可以被修改的,Java并没有提供使任何对象恒定不变的途径。

final可以用来修饰class,说明该类不能被继承,否则,编译器会报错
Java之所以引入final关键字的原因是出于两方面的考虑:
1)安全性:例如:java.lang.string这个类在java系统中扮演着极其重要的角色,所以java.lang.string被声明为final,意指部可以被继承。因为如果可以继承,某些黑客可能会从string类中继承一个类,重载该类的方法,然后在需要使用string类的地方替换为自己的类(这样执行的是他们的类的方法,这就是面向对象领域的多态型),从而达到他们的不良企图:式系统崩溃或者非法获取个人信息等。
2)设计方面的考虑:对于那些认为自己的类已经非常完美,不需要继承,可以声明为final
class   member   method   可以声明为final,表明该member   method不能被子类重载。
class   member   viarble可以声明为final,表明该变量不可以被改变,相当于C++中的const修饰符,在编译器间会完成值替换的
[ 本帖最后由 邢勇 于 2011-09-26  10:00 编辑 ]
回复 使用道具 举报
黑马网友  发表于 2011-9-26 10:06:08
板凳
final使引用恒定不变,一旦引用被初始化指向一个对象,就无法再把它改为指向另一个对象,然而对象其自身是可以被修改的,
举个例子来说:
final StringBuffer a = new StringBuffer("abc");
                   a.append("def");
                   System.out.println(a);
这样是完全可以的,a所指向的对象内容被修改,但a与对象映射关系不变。

不能改变的是这个引用与对象之间的映射关系,而对象是可以被修改的。
final StringBuffer a = new StringBuffer("abc");
final StringBuffer b = new StringBuffer("def");
                   a = b;
这样做就是会出现错误的,引用a将被改变为指向其他对象,但a被final修饰,所以一定会出错
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马