黑马程序员技术交流社区
标题:
使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
[打印本页]
作者:
张森
时间:
2013-1-3 11:11
标题:
使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
作者:
刘文超
时间:
2013-1-3 11:18
本帖最后由 刘文超 于 2013-1-3 11:23 编辑
引用不能改变了,对象可以变:
final的“不可变”不是对象里面的属性值不可以改变、而是final这个引用指向对象o就不可以再取指向其它对象o1了。对于这种说法、看我代码:
package org.qyx.online;
public class TestFinal {
public static void main(String[] args) {
final Person p1=new Person("张三");
p1.setName("李四");
System.out.println(p1.getName());//此时打印出李四,说明对象的属性是可以被改变的哦、
//p1=new Person("王五");
//当引用改变指向对象的时候,在eclipse下会提示错误
//The final local variable p1 cannot be assigned. It must be blank and not using a compound assignment
//所以”final修饰的变量是不可以被改变“中的“改变”二字说的是引用的指向不变,
//和基础类型一样,只是栈中存放的不可以被改变,实际堆中的对象是允许改变的、
}
}
class Person{
private String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
复制代码
代码可已看出,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