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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马-胡占朝 黑马帝   /  2011-7-28 01:10  /  2674 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

final关键字修饰一个变量时,是引用不变,还是引用的对象不能变?
例如
    class MyA{
           private String a;
           public MyA(Sting a){}
           pulblic String get(Sting a){}            
}
    final  MyA  a = new MyA("heima");
        a = new MyA("baima");
       a.set("baima");

评分

参与人数 1技术分 +1 收起 理由
老罗 + 1 运行一下就明白了。

查看全部评分

9 个回复

倒序浏览
黑马网友  发表于 2011-7-28 02:04:45
沙发
我认为引用本身不变,引用指向的对象也不变。
final 修饰基本类型,可以认为是常量,一旦赋值就不能修改了。
final修饰引用类型,这个引用就不能指向其他对象了,但是对象的属性能否修改是由对象的特性来决定的,不是final能决定的了。
如下这个例子:[code]final StringBuffer sb = new StringBuffer("heima");
sb = new StringBuffer("baima");//编译报错,只能指向初始指向的那个对象(引用的对象的内存地址),改变它的指向会导致编译报错[/code][code]sb.append("baima");//编译通过,final只能保证引用永远指向固定对象,不能保证那个对象的内部的数据改变[/code]共同学习!

评分

参与人数 1技术分 +2 收起 理由
老罗 + 2 我喜欢你的回答。

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-28 02:26:14
藤椅
final定义的常量分为两类:
1、对于基本数据类型,其定义的为确定的常量字面值,不能改变。
2、对于对象类型,其定义的为引用某个对象的常量指针,指针本身虽不能改变,但是对象所包含内部属性却是可以改变的。

评分

参与人数 1技术分 +1 收起 理由
老罗 + 1 学习到很晚嘛,加分。

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-28 03:09:17
板凳
[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]

评分

参与人数 1技术分 +1 收起 理由
老罗 + 1 个性签名是亮点,回答的不错。

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-28 10:44:15
报纸

回复 板凳 的帖子

fianl修饰的对象的引用不变,但是对象包含的属性可以改变。
回复 使用道具 举报
黑马网友  发表于 2011-7-28 11:46:54
地板
面试宝典中的内容
使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。例如,对于如下语句:
final StringBuffer a=new StringBuffer("immutable");
执行如下语句将报告编译期错误:
a=new StringBuffer("");
但是,执行如下语句则可以通过编译:
a.append(" broken!");

有人在定义方法的参数时,可能想采用如下形式来阻止方法内部修改传进来的参数对象:
        public void method(final  StringBuffer  param)
        {
        }
实际上,这是办不到的,在该方法内部仍然可以增加如下代码来修改参数对象:
                param.append("a");

评分

参与人数 1技术分 +2 收起 理由
老罗 + 2 不会查宝典,不错

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-28 22:17:45
7#
final修饰的变量值绝对不能变。
回复 使用道具 举报
黑马网友  发表于 2011-7-28 22:21:25
8#
引用变量不变,引用变量所指的对象的内容可变。  向地板 学习了
回复 使用道具 举报
黑马网友  发表于 2011-7-28 23:46:13
9#

回复

我个人认为是引用对象不能变,因为final 定义的是MyA类型的a对象
回复 使用道具 举报
黑马网友  发表于 2011-7-29 14:30:47
10#

Final解答

Final 类似于.NET中的常量表达Const 就是一旦赋值后就不能变了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马