变量的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