一段代码求解,final的问题
package game;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import heroes.Hero;
import javax.swing.BoxLayout;
import javax.swing.JDialog;
public class HeroChoosingDialog extends JDialog {
View myView;
boolean answerable =false;
//下面这一句用final对么,因为如果不用final的话,我的编译器会在 mouseClicked()内部报错。
//但是我实在很迷惑 final用在parameter上表示的是什么? 是不是只初始化一次之后,再也不能改变?
public HeroChoosingDialog(final View myView){
super(myView, "Choose Your Hero");
setModal(false);
this.myView = myView;
setLayout(new BoxLayout(this, BoxLayout.LINE_AXIS));
this.setVisible(true);
this.setAlwaysOnTop(true);
addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e){
if(answerable){
for(Hero every: heroes){
if(e.getSource().equals(every)){
answerable = false;
myView.heroChosen(every);
break;
}
}
}
}
});
;
this.pack();
answerable = true;
}
ArrayList<Hero> heroes;
public void addHero(Hero h){
heroes.add(h);
add(h);
pack();
}
}
------解决方案--------------------方法参数用在匿名内部类的时候,必须指定为final的。
------解决方案--------------------用不着final
myView.heroChosen(every);//和成员名和参数名一样,没有加this默认为参数了,所以才要加final
改成
this.myView.heroChosen(every);
就行了
final是用来声明引用是不可变的,就这个程序而言可以不需要这个声明
------解决方案--------------------
------解决方案--------------------三楼正解,里面在调用外部的局部参数时,这个局部参数必须是final的,如果是实例变量或者静态变量就可共用。