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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 秦桂胜 中级黑马   /  2013-11-14 13:47  /  1380 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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

评分

参与人数 1技术分 +1 收起 理由
狼王 + 1 赞一个!

查看全部评分

7 个回复

正序浏览
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]
希望对你有帮助

评分

参与人数 1黑马币 +21 收起 理由
狼王 + 21

查看全部评分

回复 使用道具 举报
bpsend 中级黑马 2013-11-14 23:37:43
7#
这个要看数据类型了,引用数据类型就是引用地址不能被改变,引用地址指向对象中的成员属性是可以被改变的。基本数据类型的话就是值不能变。

评分

参与人数 1技术分 +1 收起 理由
狼王 + 1 赞一个!

查看全部评分

回复 使用道具 举报
是引用是不能变的!使用final修饰的变量即成为常量,常量是不能可以修改的!

评分

参与人数 1技术分 +1 收起 理由
狼王 + 1 赞一个!

查看全部评分

回复 使用道具 举报
被final修饰了的变量在内存中,其内容是会固定的,即内容不能改变的,即final String str = "ssss";一旦进入内存中之后,该字符串的值就不能发生变化了,一旦发生变化,就会报错的!但是此时该对象的引用是可以变化的,当在final变量的前面再加上static的时候,该对象的引用也不能变化,就是说对于static final String = "str";中str已经是一个常量了,此时内容和引用的地址都不能发生变化!
如下所示:
final String str = "你好,final!";
                str="所示";这是无法编译的,即内容不能改变的,但是地址是可以改变的!

评分

参与人数 1技术分 +1 收起 理由
狼王 + 1 赞一个!

查看全部评分

回复 使用道具 举报
public final int  i=3;  //被final所修饰
//i=4;       //这样就是错误的 不能对其引用改变。

评分

参与人数 1技术分 +1 收起 理由
狼王 + 1 赞一个!

查看全部评分

回复 使用道具 举报
是引用不能变即指向的对象不能变,指向的对象的内容可以变。
引用变量指向对象涉及到2块内存例如下下面:Object obj = new Object();
obj对应的在栈内存当中有块内存,而new Object()创建的对象存储在堆内存当中,obj对应的内存存储的值是对象在堆内存中的首地址,的那个obj被final修饰时,指的是它对应的内存存储的对象的首地址不能变,所以所指向的对象的内容是可以变得.

评分

参与人数 1技术分 +1 收起 理由
狼王 + 1 赞一个!

查看全部评分

回复 使用道具 举报
是对象的引用不能变,被引用的对象的属性是可以改变的。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马