在 Java 中,我们使用 final
关键字和变量来指定其值不会被更改。但是我看到您可以更改类的构造函数/方法中的值。同样,如果变量是 static
那么这是一个编译错误。
这是代码:
import java.util.ArrayList;
import java.util.List;
class Test {
private final List foo;
public Test()
{
foo = new ArrayList();
foo.add("foo"); // Modification-1
}
public static void main(String[] args)
{
Test t = new Test();
t.foo.add("bar"); // Modification-2
System.out.println("print - " + t.foo);
}
}
上面的代码工作正常,没有错误。
现在将变量更改为 static
:
private static final List foo;
现在是编译错误。这 final
真的有效吗?
原文由 G.S 发布,翻译遵循 CC BY-SA 4.0 许可协议
您始终可以 初始化
final
变量。编译器确保您只能执行一次。请注意,对存储在
final
变量中的对象调用方法与final
的语义无关。换句话说:final
仅与引用本身有关,与被引用对象的内容无关。Java 没有对象不变性的概念;这是通过仔细设计对象来实现的,并且是一项非常艰巨的工作。