Final String []和Final String

时间:2014-09-24 13:54:45

标签: java arrays jframe actionlistener final

我很困惑。我尝试使用

final String usr;

并尝试更改其值从未起作用,但当我使用数组final String[] usr = {"", ""};时,它可以正常工作。我甚至从这个

访问它
sgnup.addActionListener(new ActionListener(){
     public void actionPerformed(ActionEvent e){
         user[0] = sUsr.getText();
      }
 });

我发现它非常混乱,因为我对final的理解是用final声明的变量并为其添加值,值永远不会改变。但为什么final的数组工作?我甚至可以将文本设置为其中一个数组。

2 个答案:

答案 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修饰符即可避免使用数组。