本帖最后由 杨健yj 于 2012-8-14 22:44 编辑
使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的
我们之所以会产生问题是因为我们通常会想到赋值变量如final a =5;我们就会认为a的值不可以改变了就
是5这是对的。但当变量a变成引用型变量时,我们可能就会纳闷了。如final b = new Person()- class Person
- {
- public String name="wang";
- }
复制代码 然后我们就会认为b所代表的这个Person对象不能改变(改变名字b.name="li"),实际上这样理解是错误的。
这样的知识我们可以敲一下代码实验下就会知道当我们做b.name="li"编译没有错误,那是怎么回事呢。
问题就是final修饰的是b,b此刻的值为一个地址值,只要b的值没有改变就符合final,和他所指的对象是否
改变没有关系。然而b=new Person(),这样就会报错,因为改变了b的值,所以final修饰的是变量本身的值不变就
可以,与其他无关。
对于内部类当然适用啊- class Outer
- {
- void method()
- {
- final StringBuffer a=new StringBuffer("immutable");
- final Integer b=5;
- class Inner
- {
- void funnction()
- {
- a.append(" broken!");//这里a所指的对象的内容变了,但a所指对象的地址没改变,正确
- b=b+1;//这里b的值改变了所以会报错的
- }
- }
- new Inner().funnction();
- }
- }
复制代码 |