为什么我仍然可以更改这个 final 变量?

3
如果 name 被声明为 final,为什么我仍然可以调用 name.append 并且输出是:shreya? 我认为 final 变量一旦赋值就不能被更改?
public class Test1 {

    final static StringBuilder name = new StringBuilder("sh");
    public static void main(String[] args) {

        name.append("reya");
        System.out.println(name);
    }

}

你没有通过 name.append("reya") 改变这个变量的值,这个变量的值是一个内存位置(new StringBuilder("sh"))。 - Gödel77
你不能改变 final 变量 name,你只能改变该变量所指向的对象。 - Peter Lawrey
2个回答

13

final 指的是不能改变引用,例如您不能说 name = new StringBuilder()。它不会使所引用的对象不可变。

不可变性是一个类的属性。可变类型的对象始终是可变的。


5

您需要开始区分变量、值(引用值和原始值)以及对象和基本类型。

变量是值的容器。该值可以是引用值(适用于对象)或原始值。

一旦使用其原始值对其进行初始化,就无法使用赋值运算符将新值分配给final变量。


不是真的,final只是编译器的限制。你可以使用反射或字节码本身来修改final变量。 - Enerccio
@Enerccio 这个措辞对你来说更好吗? - Sotirios Delimanolis

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