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();
}
}

解决方案 »

  1.   

    方法参数用在匿名内部类的时候,必须指定为final的。
      

  2.   

    用不着finalmyView.heroChosen(every);//和成员名和参数名一样,没有加this默认为参数了,所以才要加final
    改成
    this.myView.heroChosen(every);
    就行了final是用来声明引用是不可变的,就这个程序而言可以不需要这个声明
      

  3.   

    3楼你确定么?你不加final能编译通过?自己好好试过再说吧。
      

  4.   

    拜托先看清楚我后面写的,
    改成this.myView.heroChosen(every);
    以后,用的是成员myView,而不是参数myView,所以就不需要final了
      

  5.   

    三楼正解,里面在调用外部的局部参数时,这个局部参数必须是final的,如果是实例变量或者静态变量就可共用。