无法分配最终的局部变量
我有一个座位数组,该数组有两个字符串(已选择和为空)。单击鼠标后,我想遍历数组并找到选定的座位。当我按下按钮时,它说:
无法分配最终的局部变量seatno,因为它是用封闭类型定义的。
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);
回答:
关键是封闭类型中的方法局部变量实际上已
到匿名类的实例中(这是由于激活框架的问题,但我将不做进一步的详细介绍,因为这与问题无关)。这就是为什么它们需要是final的原因,因为嵌套类型实例中的变量不再相同。
因此,这是第一个示例:
void foo() { int a = 3;
new Runnable() {
@Override
public void run() {
a += 3;
}
};
}
这不会编译,因为您无法在匿名类的方法中引用非最终变量。当您在的声明中添加最终修饰符时a
,的值a
将被复制到您定义的匿名类的创建实例中。但是,将不允许您更改的值a
,因为所做的更改对于a
声明位置的方法不可见。
但是,匿名类不是静态的,也就是说,它们具有对封闭实例的引用(除非声明它们的方法是静态的),您可以使用它来修改封闭实例的变量:
int a = 3;void foo() {
new Runnable() {
@Override
public void run() {
a += 3;
}
};
}
该示例确实进行了编译,a
每次run()
调用匿名类实例的方法时,它都会增加3 。(在此示例中,从不调用它,而只是一个示例。)
因此,总而言之,您需要将变量seatno
从方法局部变量转换为封闭类型的实例变量。或者,如果还没有,则需要删除final修饰符,因为final变量只能分配一次。
在Java 8中,引入了 有效的最终
变量的概念(请参阅Java语言规范)。但是,在此帖子的第一个示例中,变量a
被多次分配,这使变量无法有效地最终确定。这意味着该示例仍无法使用Java
8进行编译。(编译错误为“在封闭范围内定义的局部变量a必须是最终的或实际上是最终的”)
以上是 无法分配最终的局部变量 的全部内容, 来源链接: utcz.com/qa/404158.html