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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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

5 个回复

倒序浏览
修饰一个变量时,这个变量就变成了常量了,我觉得应该是两者都不能被改变
如:
final int MAX=10;
那么MAX就一直指向一个基本字面值常量10,不能被改变,
就是不能给他赋值20或者30
比如再执行
int MAX=20;
是无法执行的

final int MAX=20; 这句也是无法执行的。
他的地址值也是一样不能被改变的。
因为不能把别的地址值给他,
比如
int a;
int MAX=a;
这两句也是行不通的
回复 使用道具 举报
public class Test3 {
        public static void main(String[] args) {
                final Person p = new Person(25);
                System.out.println(p.getAge());
               
                p.setAge(100);                                                //引用指向的对象可以改变属性值
                System.out.println(p.getAge());
               
                //p = new Person();                                        //编译报错,引用不能被改变
        }
}

class Person {
        private int age;
       
        public Person() {
                super();
        }

        public Person(int age) {
                super();
                this.age = age;
        }

        public int getAge() {
                return age;
        }

        public void setAge(int age) {
                this.age = age;
        }
}
回复 使用道具 举报
使用final 关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改
变的。例如,对于如下语句:
final StringBuffer a=new StringBuffer("immutable");
执行如下语句将报告编译期错误:
a=new StringBuffer("");
但是,执行如下语句则可以通过编译:
a.append(" broken!");
有人在定义方法的参数时,可能想采用如下形式来阻止方法内部修改传进来的参数对象:
public void method(final StringBuffer param)
{
}
实际上,这是办不到的,在该方法内部仍然可以增加如下代码来修改参数对象:

param.append("a");

我只是大自然的搬运工
回复 使用道具 举报
变量为基本数据类型时, 使用final关键字修饰的变量值不可改变。为引用数据类型时,引用的对象不可改变,但对象指向的空间的内容可以修改
回复 使用道具 举报
引用的对象不变的吧,因为已经被final修饰了,引用已经定了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马