黑马程序员技术交流社区
标题:
关于final关键字
[打印本页]
作者:
黑马-胡占朝
时间:
2011-7-28 01:10
标题:
关于final关键字
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");
作者:
匿名
时间:
2011-7-28 02:04
我认为引用本身不变,引用指向的对象也不变。
final 修饰基本类型,可以认为是常量,一旦赋值就不能修改了。
final修饰引用类型,这个引用就不能指向其他对象了,但是对象的属性能否修改是由对象的特性来决定的,不是final能决定的了。
如下这个例子:[code]final StringBuffer sb = new StringBuffer("heima");
sb = new StringBuffer("baima");//编译报错,只能指向初始指向的那个对象(引用的对象的内存地址),改变它的指向会导致编译报错[/code][code]sb.append("baima");//编译通过,final只能保证引用永远指向固定对象,不能保证那个对象的内部的数据改变[/code]共同学习!
作者:
匿名
时间:
2011-7-28 02:26
final定义的常量分为两类:
1、对于基本数据类型,其定义的为确定的常量字面值,不能改变。
2、对于对象类型,其定义的为引用某个对象的常量指针,指针本身虽不能改变,但是对象所包含内部属性却是可以改变的。
作者:
匿名
时间:
2011-7-28 03:09
[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-28 10:44
标题:
回复 板凳 的帖子
fianl修饰的对象的引用不变,但是对象包含的属性可以改变。
作者:
匿名
时间:
2011-7-28 11:46
面试宝典中的内容
使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。例如,对于如下语句:
final StringBuffer a=new StringBuffer("immutable");
执行如下语句将报告编译期错误:
a=new StringBuffer("");
但是,执行如下语句则可以通过编译:
a.append(" broken!");
有人在定义方法的参数时,可能想采用如下形式来阻止方法内部修改传进来的参数对象:
public void method(final StringBuffer param)
{
}
实际上,这是办不到的,在该方法内部仍然可以增加如下代码来修改参数对象:
param.append("a");
作者:
匿名
时间:
2011-7-28 22:17
final修饰的变量值绝对不能变。
作者:
匿名
时间:
2011-7-28 22:21
引用变量不变,引用变量所指的对象的内容可变。 向地板 学习了
作者:
匿名
时间:
2011-7-28 23:46
标题:
回复
我个人认为是引用对象不能变,因为final 定义的是MyA类型的a对象
作者:
匿名
时间:
2011-7-29 14:30
标题:
Final解答
Final 类似于.NET中的常量表达Const 就是一旦赋值后就不能变了
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2