最后的局部variables不能被赋值

我有一个arrays的席位,数组有两个string(select和空)。 点击鼠标,我想遍历数组并find所选的座位。 当我按下button说:

最后的局部variablesseatno不能被赋值,因为它是在封闭types中定义的。

JButton btnContinue = new JButton("Next"); btnContinue.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent arg0) { for(int x=0;x<17;x++){ if(anArray[x]=="selected"){ seatno = anArray[x]; } } data page=new data(newfrom,newto,newtime,date2,seatno); page.setVisible(true); setVisible(false); } }); btnContinue.setBounds(358, 227, 62, 23); contentPane.add(btnContinue); 

问题的关键是方法 – 来自封闭types的局部variables实际上被复制到匿名类的实例(这是因为激活框架的问题,但我不会进一步细化,因为这不是真正相关的问题),这这就是为什么他们需要是最终的,因为嵌套types实例中的variables不再是相同的。

所以,这里是第一个例子:

 void foo() { int a = 3; new Runnable() { @Override public void run() { a += 3; } }; } 

这不会编译,因为您不能在匿名类的方法中引用非最终variables。 当你为a的声明添加一个final修饰符时, a的值将被复制到已经定义的匿名类的已创build实例中。 但是,您将不被允许更改a的值,因为更改对于声明a的方法不可见。

但是,匿名类不是静态的,也就是说,它们有一个对包含实例的引用(除非它们声明的方法是静态的),您可以使用它来修改包含实例的variables:

 int a = 3; void foo() { new Runnable() { @Override public void run() { a += 3; } }; } 

这个例子进行编译,每次调用匿名类的实例的run()方法时,它会增加3。 (在这个例子中,它永远不会被调用,但这仅仅是一个例子。)

因此,总而言之,您需要将variablesseatno从方法局部variables转换为封闭types的实例variables。 或者,如果它尚未完成,则需要删除最终修饰符,因为最终variables只能分配一次。

更新:在Java 8中,引入了有效最终variables的概念(请参阅Java语言规范 )。 但是,在这篇文章的第一个例子中,variablesa被分配了多次,这就防止了它被有效的终结。 这意味着这个例子仍然不能用Java 8编译。(编译错误是“在一个封闭范围内定义的本地variables必须是最终的或有效的最终的”)。

除了定义一个类成员variables,你也可以使用一个可变的int来实现。

 void foo() { final MutableInt a = new MutableInt(3); new Runnable() { @Override public void run() { a.add(3); } }; } 

由于MutableInt不是原始types(因此通过引用传递),可以重新分配这个工程。

最后一个variables不能改变它的值(它类似于C / C ++的const)。

你可能想把它作为一个类的字段(当然没有final关键字),而不是函数内的局部variables。

我最近面临类似的问题。 在我的情况下,创build最终数组(或集合),并添加variables,我想在匿名类中更改为这个数组,如下所示。

  int a = 3; final int[] array = new int[1]; array[0] = a; new Runnable() { @Override public void run() { array[0] += 3; } }; 

在不知道seatno的声明的seatno ,我build议在mouseClicked()方法中引入一个新的variables,这个variables不是最终的,并且与seatno当前所做的工作相同,因为variables似乎只在该方法内部使用。

顺便说一句:大写你的类名( data应该是Data )。 看起来会更清楚。

确保你的variables没有final修饰符。

 //final, can be set only when the object is created. private final String seatno; //no final modifier, the value can be set every time you "want" private String seatno; 

此外,要比较string,你应该使用equals

 if(anArray[x].equals("selected"))