黑马程序员技术交流社区

标题: 关于final关键字的问题 ,急 [打印本页]

作者: 秦桂胜    时间: 2013-11-14 13:47
标题: 关于final关键字的问题 ,急
使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?  

作者: lyc87007643    时间: 2013-11-14 13:51
是对象的引用不能变,被引用的对象的属性是可以改变的。

作者: linjl_ll    时间: 2013-11-14 13:54
是引用不能变即指向的对象不能变,指向的对象的内容可以变。
引用变量指向对象涉及到2块内存例如下下面:Object obj = new Object();
obj对应的在栈内存当中有块内存,而new Object()创建的对象存储在堆内存当中,obj对应的内存存储的值是对象在堆内存中的首地址,的那个obj被final修饰时,指的是它对应的内存存储的对象的首地址不能变,所以所指向的对象的内容是可以变得.
作者: lichao    时间: 2013-11-14 14:24
public final int  i=3;  //被final所修饰
//i=4;       //这样就是错误的 不能对其引用改变。
作者: 星星Fighting    时间: 2013-11-14 14:32
被final修饰了的变量在内存中,其内容是会固定的,即内容不能改变的,即final String str = "ssss";一旦进入内存中之后,该字符串的值就不能发生变化了,一旦发生变化,就会报错的!但是此时该对象的引用是可以变化的,当在final变量的前面再加上static的时候,该对象的引用也不能变化,就是说对于static final String = "str";中str已经是一个常量了,此时内容和引用的地址都不能发生变化!
如下所示:
final String str = "你好,final!";
                str="所示";这是无法编译的,即内容不能改变的,但是地址是可以改变的!

作者: 菜不鸟    时间: 2013-11-14 22:43
是引用是不能变的!使用final修饰的变量即成为常量,常量是不能可以修改的!
作者: bpsend    时间: 2013-11-14 23:37
这个要看数据类型了,引用数据类型就是引用地址不能被改变,引用地址指向对象中的成员属性是可以被改变的。基本数据类型的话就是值不能变。
作者: 杨增坤    时间: 2013-11-14 23:42
final可以修饰成员变量,也可以修饰局部变量、形参。final变量一旦获得初始值之后,final的变量就不能被重新赋值。
   成员变量是随类初始化或对象初始化而初始化的,当执行静态初始化块时候可以对类属性进行赋初始值,当执行普通初始化块或者构造器的时候可以对实例属性赋初始值。因此成员变量的初始值可以在定义的时候赋值或者在初始化块、构造器中指定。
   对于final修饰的成员变量而言,一旦有了初始值之后,就不能被重新赋值,因此不可以在普通方法中对成员变量赋值。要么在定义的时候赋值,要么在方法块和构造器中赋值。
   final成员变量,必须由程序员显示初始化,系统不会对final成员进行隐式初始化。

   final修饰局部变量时既可以在定义时候指定默认值,也可以不指定,在后面指定,但只能一次。
   final修饰基本类型的时候 变量不能改变
   final修饰引用类型变量,final只保证这个引用的地址不变,即一直引用同一对象。但这个对象可以改变。

上面是找到的资料:
总结就是:final修饰的基本类型的变量:只要赋给了值,其值就不能呗改变
               final修饰的是引用变量,只要其引用地址没有变,其对应的值是可以改变的,(就和你说的数组就是引用类型)

public static void main(String[] s) {
                final int[] Arr = { 5, 6, 12, 8 };//引用类型,其值是可以改变的
                Arr[2] = -8;
        System.out.println(Arr[2]);
        final int num=1;//基本类型,其值是不可以变的
        //num=10;//num 有了初值,不能更改
       final ArrayList list=new ArrayList();//集合是引用类型,所以其中元素的值是可以改变的
        list.add(1);
        list.add(2);
        System.out.println(list);
        list.set(0, 0);
        System.out.println(list);
        }
结果:
-8
[1, 2]
[0, 2]
希望对你有帮助






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