日期:2014-05-20  浏览次数:20633 次

一段代码求解,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是用来声明引用是不可变的,就这个程序而言可以不需要这个声明
------解决方案--------------------
探讨

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

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