变量的Java final关键字

时间:2010-11-16 18:15:41

标签: java immutability final

final关键字如何使变量不可变? Wikipedia says it doesn't.

6 个答案:

答案 0 :(得分:31)

在Java中,术语 final 指的是引用,而 immutable 指的是对象。将final修饰符分配给引用意味着它不能更改为指向另一个对象,但如果对象本身是可变的,则可以对其进行修改。

例如:

final ArrayList<String> arr = new ArrayList<String>();
arr.add("hello"); // OK, the object to which arr points is mutated
arr = null; // Not OK, the reference is final and cannot be reassigned to

正如维基百科的文章所提到的,如果你来自C ++,你必须将const的概念分离为final并且不可变。

答案 1 :(得分:3)

虽然不推荐使用,但Java允许使用reflection修改最终变量。

答案 2 :(得分:1)

假设您已声明myList是final。您仍然可以向myList添加新项,因此其状态不是不可变的。由于final关键字,您不能做的是更改myList以引用其他列表。

答案 3 :(得分:1)

阅读维基百科文章的其余部分:

  

说明终极性没有   保证不变性:假设我们   替换三个位置变量   只用一个:       公共最终位置pos;其中pos是具有三个属性的对象   pos.x,pos.y和pos.z.然后pos   无法分配,但三者   属性可以,除非它们是最终的   自己。

答案 4 :(得分:0)

因为如果引用是最终的,您仍然可以更改引用所指向的对象中的内容。你不能改变参考。

答案 5 :(得分:0)

对于诸如int, double, char之类的原语,它可以更像你期望的那样工作。

private final int status = 10;
status = 20; // WONT COMPILE because status is final