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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王鑫宇 黑马帝   /  2011-7-30 10:25  /  1843 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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

5 个回复

倒序浏览
黑马网友  发表于 2011-7-30 10:39:19
沙发
final关键字修饰的成员变量的对象引用不能修改
public class racing_cycle
{
       public final static int i = 11;
       public static void main(String args[])
       {
               racing_cycle rc = new racing_cycle();
               i = i + 1;
               System.out.println(i);
        }
}
这段代码运行时就会发生错误,因为在前面将 i 变量定义为final类型,该值是不可以改变的。main方法中
要将变量i + 1   所以就会出错。
回复 使用道具 举报
黑马网友  发表于 2011-7-30 10:39:29
藤椅
final 用于对象引用,使引用恒定不变,一旦引用被初始化指向一个对象,就无法对它进行改变以指向另一个对象。然而,对象其本身是可以修改的,Java并未提供使任何对象恒定不变的途径。
回复 使用道具 举报
黑马网友  发表于 2011-7-30 10:46:53
板凳
这种问题论坛有很多人发了,你可以---在论坛logo下输入关键字搜索
[color=Red]是引用不能变,但是引用所指向的对象是可以变得[/color]

因为对于[color=Blue]引用类型的变量而言,他保存的仅仅是一个引用[/color],
[color=Red]final修饰的只能保证这个引用所引用的地址不会改变,即只要一直引用同一个对象,但是这个对象完全可以发生改变[/color]
我们用程序来说明这一点:[code=java]package cn.itcast.heima
import java.util.Arrays;
class Person
{
        private int age;
         //无参构造方器
        public Person(){}
         //有参构造方器
        public Person(int age)
        {
                this.age = age;
        }
         //age属性的setter、getter方法
        public void setAge(int age)
        {
                this.age = age;
        }
        public int getAge()
        {
                 return this.age;
        }
}
public class Demo
{
        public static void main(String[] args)
        {
                //final修饰数组变量,iArr是一个引用变量
                final int[] iArr = {5, 6, 12, 9};
                System.out.println(Arrays.toString(iArr));
                //对数组元素进行排序,合法
                Arrays.sort(iArr);
                System.out.println(Arrays.toString(iArr));
                //对数组元素赋值,合法
                iArr[2] = -8;
                System.out.println(Arrays.toString(iArr));
                //下面语句对iArr重新赋值,非法
                iArr = null;
                //final修饰Person变量,p是一个引用变量
                final Person p = new Person(45);
                //改变Person对象的age属性,合法
                p.setAge(23);
                System.out.println(p.getAge());
                //下面语句对p重新赋值,非法
                //p = null;
        }
}[/code]您也可以参考这个帖子了解更多的内容
[url]http://bbs.itheima.com/thread-268-1-1.html[/url]
回复 使用道具 举报
黑马网友  发表于 2011-7-30 11:05:57
报纸
引用的对象不能变
回复 使用道具 举报
黑马网友  发表于 2011-7-30 11:16:28
地板
哦,好吧,虽然有俩种答案,也明白了。谢谢了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马