黑马程序员技术交流社区

标题: 使用final关键字修饰一个变量时 [打印本页]

作者: 黄方    时间: 2012-3-11 22:53
标题: 使用final关键字修饰一个变量时
使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
作者: 房宝彬    时间: 2012-3-11 23:01
Final 中文意思,最终的,唯一的,在JAVA里 被Final修饰的变量 称之为全局常量,变量值不可以被改变,

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

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


作者: 黄方    时间: 2012-3-11 23:14
房宝彬 发表于 2012-3-11 23:01
Final 中文意思,最终的,唯一的,在JAVA里 被Final修饰的变量 称之为全局常量,变量值不可以被改变,

你说的引 ...

额,我是指这一种   final StringBuffer a=new StringBuffer("immutable");
作者: 宋洪祥    时间: 2012-3-11 23:22

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

有人在定义方法的参数时,可能想采用如下形式来阻止方法内部修改传进来的参数对象:
        public void method(final  StringBuffer  param)
        {
        }
实际上,这是办不到的,在该方法内部仍然可以增加如下代码来修改参数对象:
                param.append("a");
作者: OMG    时间: 2012-3-11 23:23
对的,final修饰的变量的值是不能被重新赋值的。
作者: 刘豪杰    时间: 2012-3-11 23:26
对于对象引用,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,引用恒定不变
}

作者: 贠(yun)靖    时间: 2012-3-12 02:55
final 关键字
        1,可以修饰类,函数,变量。
        2,被final修饰的类不可以被继承。
        3,被final修饰的方法不可以被覆盖(重写)。
4,被final修饰的变量时一个常量只能赋值一次,即可以袖手成员变量,又可以修饰局部变量。把被修饰的变量视为常量,且常量的书写规范所有字母都大写,多个单词时,用“_”分开即可。
5,内部类定义在类中的局部位置上时,只能访问该局部被final修饰的局部变量





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2