Java变量的final关键字

17
6个回答

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和immutable。


3

虽然不建议这样做,但Java允许使用反射修改final变量。


1
假设您已经声明了myList为final。您仍然可以向myList添加新项目,因此它的状态不是不可变的。由于final关键字,您无法将myList更改为引用其他列表。

1

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

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


0

因为如果一个引用是final的,你仍然可以更改引用所指向的对象中的内容。你只是不能更改引用本身。


0

对于像 int, double, char 等基本类型,它的工作方式更符合您的预期。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接