黑马程序员技术交流社区

标题: 使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变? [打印本页]

作者: 张森    时间: 2013-1-3 11:11
标题: 使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
作者: 刘文超    时间: 2013-1-3 11:18
本帖最后由 刘文超 于 2013-1-3 11:23 编辑

引用不能改变了,对象可以变:
final的“不可变”不是对象里面的属性值不可以改变、而是final这个引用指向对象o就不可以再取指向其它对象o1了。对于这种说法、看我代码:
  1. package org.qyx.online;

  2. public class TestFinal {

  3.         public static void main(String[] args) {
  4.                 final Person p1=new Person("张三");
  5.                 p1.setName("李四");
  6.                 System.out.println(p1.getName());//此时打印出李四,说明对象的属性是可以被改变的哦、
  7.                
  8.                 //p1=new Person("王五");
  9.                
  10.                 //当引用改变指向对象的时候,在eclipse下会提示错误
  11.                 //The final local variable p1 cannot be assigned. It must be blank and not using a compound assignment
  12.                 //所以”final修饰的变量是不可以被改变“中的“改变”二字说的是引用的指向不变,
  13.                 //和基础类型一样,只是栈中存放的不可以被改变,实际堆中的对象是允许改变的、
  14.         }

  15. }

  16. class Person{
  17.         private String name;

  18.         public Person(String name) {
  19.                 this.name = name;
  20.         }

  21.         public String getName() {
  22.                 return name;
  23.         }

  24.         public void setName(String name) {
  25.                 this.name = name;
  26.         }
  27.         
  28. }
复制代码
代码可已看出,final修饰的,可以将对象属性张三改成李四,但不能让final的指向另一个王五啦
作者: 周亮    时间: 2013-1-3 11:20
final可以修饰基本成员变量,也可以修饰引用类型的变量,当修饰引用类型的变量的时候,引用变脸不可以改变,也就是说引用变量所代表的对象的内存地址值是不可以改变的,也就是你说的对象是不可以改变的,但是对象里面的内容却是可以改变的。
作者: 肖志锋    时间: 2013-1-3 21:11
不能改变的是值,不管是地址值,还是值,但是对于引用类型,是可以用方法改变实体的。
作者: 李奇    时间: 2013-1-3 21:37
举个例子吧
public class Dog{
        String name;
        public Dog(String name){
                this.name=name;
        }
}
public class Test {
        public static void main(String[] args) {

                final Dog dog=new Dog("欧欧");
                dog.name="美美";
                dog=new Dog("亚亚");
}
}
由以上代码可知,dog.name="美美";这行代码是正确的,dog=new Dog("亚亚");却挂了,引用型变量要区分对象的属性值和对象的引用值。总结一下,使用final修饰引用型变量,变量的值固定不变,而变量所指向的对象的属性值是可变的。
作者: 何竹冬    时间: 2013-1-4 15:58
你好
final可以修饰变量时表示变量的值不可变,也就是引用不可变,不可以重新赋值。
如果final修饰一个基本类型比如final int a=0;a的值就是0不可改变,不可以重新给a赋值a=1会报错。
如果final修饰的是一个引用类型的变量表示引用不可变它总是指向这个对象,不可以重新给引用赋值。




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