我很困惑。我尝试使用
final String usr;
并尝试更改其值从未起作用,但当我使用数组final String[] usr = {"", ""};
时,它可以正常工作。我甚至从这个
sgnup.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
user[0] = sUsr.getText();
}
});
我发现它非常混乱,因为我对final
的理解是用final
声明的变量并为其添加值,值永远不会改变。但为什么final
的数组工作?我甚至可以将文本设置为其中一个数组。
答案 0 :(得分:1)
是的,因为您没有更改usr
的引用,但它包含的内容。 final
阻止您执行usr = new String[5];
之类的操作(将usr
更改为另一个数组),但可以毫无问题地更改数组的内容。
final String[] a = new String[5];
a = new String[3]; // illegal
final String[] a = new String[5];
a[0] = "Hello"; // legal, i don't change a but what is inside a[0]
答案 1 :(得分:0)
在Java中,任何对象类型(包括任何数组)的变量实际上都是对象的引用,而不是对象本身。当您将变量声明为final
时,这意味着引用不会更改,这意味着它引用的对象将始终是同一个对象。但是,如果在没有final
修饰符的情况下对象的内部状态仍然可以更改,则添加final
将不会阻止引用对象的内部状态发生更改。特别是对于final
数组,数组引用本身不能重新赋值,但数组元素仍然可以更改。
在您的情况下,只需从final
变量中删除String
修饰符即可避免使用数组。