变量的Java final关键字

final关键字如何不使变量成为不可变的? 维基百科说它没有。

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

例如:

 final ArrayList arr = new ArrayList(); 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和不可变的。

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

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

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

为了说明终极性不能保证不变性:假设我们用一个位置变量替换三个位置变量:public final Position pos; 其中pos是一个具有三个属性pos.x,pos.y和pos.z的对象。 然后pos不能分配给,但这三个属性可以,除非它们是最终的。

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

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

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