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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黄方 中级黑马   /  2012-3-11 22:53  /  2023 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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

6 个回复

倒序浏览
Final 中文意思,最终的,唯一的,在JAVA里 被Final修饰的变量 称之为全局常量,变量值不可以被改变,

你说的引用 和引用对象 是指变量名和变量值么?

final修饰的变量在栈中,只不过它修饰的变量只能赋一次值。因此对每个new出来的对象来说,final修饰的变量具有唯一的特点,因为赋了一次值后就不能改变了

回复 使用道具 举报
房宝彬 发表于 2012-3-11 23:01
Final 中文意思,最终的,唯一的,在JAVA里 被Final修饰的变量 称之为全局常量,变量值不可以被改变,

你说的引 ...

额,我是指这一种   final StringBuffer a=new StringBuffer("immutable");
回复 使用道具 举报

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

有人在定义方法的参数时,可能想采用如下形式来阻止方法内部修改传进来的参数对象:
        public void method(final  StringBuffer  param)
        {
        }
实际上,这是办不到的,在该方法内部仍然可以增加如下代码来修改参数对象:
                param.append("a");
回复 使用道具 举报
对的,final修饰的变量的值是不能被重新赋值的。
回复 使用道具 举报
对于对象引用,final使引用恒定不变。一旦引用被初始化指向一个对象,就无法再把它改为指向另一个对象。然后对象自身却是可以被修改的。比如:
class Value
{
int i;
public Value(int i){this.i=i;}
}
public class FinalData
{
private Value v1=new Value(8);
private final Value v2=new Value(11);
public static void main(String[] args)
{
   FinalData fd=new FinalData();
   fd.v1.i++; //可以,因为v1可以改变
   fd.v2.i++; //可以,对象本身可以改变
   fd.v1=new Value(12); //可以,因为不是final
   fd.v2=new Value(15); //错误!因为v2是final,引用恒定不变
}
回复 使用道具 举报
final 关键字
        1,可以修饰类,函数,变量。
        2,被final修饰的类不可以被继承。
        3,被final修饰的方法不可以被覆盖(重写)。
4,被final修饰的变量时一个常量只能赋值一次,即可以袖手成员变量,又可以修饰局部变量。把被修饰的变量视为常量,且常量的书写规范所有字母都大写,多个单词时,用“_”分开即可。
5,内部类定义在类中的局部位置上时,只能访问该局部被final修饰的局部变量
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马