Java 中的最终变量操作

2022-09-01 00:19:27

任何人都可以告诉我以下行在Java上下文中的含义是什么:

最终变量仍然可以纵,除非它是不可变的

据我所知,通过声明任何变量为 final,您无法再次更改它,那么它们在上面的行中不可变的单词是什么意思?


答案 1

这意味着,如果你的最终变量是一个引用类型(即不是像int这样的基元),那么只有引用是不能改变的。不能让它引用不同的对象,但是如果类允许,它所引用的对象的字段仍然可以更改。例如:

final StringBuffer s = new StringBuffer();

StringBuffer 的内容仍然可以任意更改:

s.append("something");

但你不能说:

s = null;

s = anotherBuffer;

另一方面:

final String s = "";

字符串是不可变的 - 根本没有任何方法可以让你改变字符串(除非你使用反射 - 然后下地狱)。


答案 2

如果您有对 Java 对象的最终引用,您仍然可以操作它,但不能更改其引用。例如,此代码是完全合法的:

import javax.swing.JLabel;

class Test1 {
    private final static JLabel l = new JLabel("Old text");
    public static void main(String[] args) {
        System.err.println(l.getText());
        l.setText("New Text");
        System.err.println(l.getText());
    }
}

但你不能说:

l = new JLabel("Newest Text");

在第一次赋值给 l.请注意,您可以执行此操作:

import javax.swing.JLabel;

class Test1 {
    public static void main(String[] args) {
        final JLabel l;
        String s = getArbitaryString(); // Assume this method returns a string
        l = new JLabel(s);
        System.err.println(l.getText());
    }
}

这是可以做到的,因为当声明l时,它不会分配给任何甚至不为null的东西。因此,您只能向它分配一次某些内容。

基元也是如此。您可以为其分配一个值,如下所示:

class Test1 {
    public static void main(String[] args) {
        final int i;
        i = 2;
    }
}

但是现在你不能进一步操纵它,因为你唯一能对基元类型做的就是为它们赋值。