黑马程序员技术交流社区
标题:
关于final的
[打印本页]
作者:
傲鸽
时间:
2013-7-17 01:34
标题:
关于final的
1,
public class Something {
public int addOne(final int x) {
return ++x;
}
}
复制代码
2,
public class Something {
public static void main(String[] args) {
Other o = new Other();
new Something().addOne(o);
}
public void addOne(final Other o) {
o.i++;
}
}
class Other {
public int i;
}
复制代码
为什么以上两题的参数同样被修饰成final,1是错的,而2就是对的呢?
作者:
chensc
时间:
2013-7-17 05:44
学习学习!
作者:
xscn
时间:
2013-7-17 15:43
本帖最后由 xscn 于 2013-7-17 15:47 编辑
第一个:int x被修饰成final,意味着x不能在addOne函数中被修改
第二个:对象o被修饰成final。这里修改的是o的成员变量,而在方法体中自增了对象中的属性 i 的值,而对象的引用地址没有被修改,因此不会发生错误。
如果在方法体中写上:o = new Other(); 这时就会报错了。
通俗点讲,final加在对象前,是指该对象不能改变引用,即使是final对象,对象中的变量还是可以更改的。
作者:
a767175432
时间:
2013-7-17 15:47
第一个形参被final修饰只能被实参传过来对它赋值 你在返回的时候是++i,这样就再次修改了i的值,被final修饰是不能被二次修改的,所以报错。
第二个形参的类型是一个引用类型,它的地址是不能被二次修改的,它的属性可以被二次修改,因为它的属性没被final修饰
public void addOne(final Other o) {
o.i++;
}
o没被修改,只是o.i被修改了
作者:
于世德
时间:
2013-7-17 16:42
当final修饰基本类型时,该值不允许改变;当final修饰复合类型时,该引用不可改变。你第一段代码中final修饰的变量是基本类型,所以变量x的值不允许改变,而第二段修饰的是复合类型o,所以o这个变量指向的堆内存地址不允许改变, o.i++; 这段代码只是改变了i的值,而o的值没有变
作者:
赵太云
时间:
2013-7-17 18:46
被final修饰的变量只不能被重新赋值。
但是引用类型的变量的成员变量是可以进行相应的修改的。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2