Java 中的最终变量操作
任何人都可以告诉我以下行在Java上下文中的含义是什么:
最终变量仍然可以纵,除非它是不可变的
据我所知,通过声明任何变量为 final,您无法再次更改它,那么它们在上面的行中不可变的单词是什么意思?
任何人都可以告诉我以下行在Java上下文中的含义是什么:
最终变量仍然可以纵,除非它是不可变的
据我所知,通过声明任何变量为 final,您无法再次更改它,那么它们在上面的行中不可变的单词是什么意思?
这意味着,如果你的最终变量是一个引用类型(即不是像int这样的基元),那么只有引用是不能改变的。不能让它引用不同的对象,但是如果类允许,它所引用的对象的字段仍然可以更改。例如:
final StringBuffer s = new StringBuffer();
StringBuffer 的内容仍然可以任意更改:
s.append("something");
但你不能说:
s = null;
或
s = anotherBuffer;
另一方面:
final String s = "";
字符串是不可变的 - 根本没有任何方法可以让你改变字符串(除非你使用反射 - 然后下地狱)。
如果您有对 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;
}
}
但是现在你不能进一步操纵它,因为你唯一能对基元类型做的就是为它们赋值。