//请问大家:为什么一定要将TextField 修饰为final了,如果将它写在ActionWindow(String s) 外就不用加了,为什么呢?import java.awt.*;
import java.awt.event.*;
//进行匿名类的练习public class TestWindow {
public static void main(String[] args) {
new ActionWindow("test");


}}
class ActionWindow extends Frame {
//TextField tf=new TextField(10) 如果这样写就不用加final了?为什么?
 
ActionWindow(String s) {

super (s);
final TextField tf=new TextField(10);//因为下面在匿名类里使用了tf对象的方法,所以不知道为什么要加final
 Button b=new Button("start");//定义一个按钮
add(b,BorderLayout.NORTH);
add(tf,BorderLayout.SOUTH);
b.addActionListener(new ActionListener() {//使用匿名类
private int i;
public void actionPerformed(ActionEvent e){
tf.setText(e.getActionCommand()+ ++i);//在内部类使用了tf的方法

}
});
addWindowListener(new WindowAdapter() {//使用匿名类
public void windowClosing(WindowEvent e) {

setVisible(false);
System.exit(0);


}
});
pack();
setVisible(true);



}
}

解决方案 »

  1.   

    匿名内部类是出现在一个方法的内部的,如果它要访问这个方法的参数或者方法中定义的变量,则这些参数和变量必须被修饰为final。因为虽然匿名内部类在方法的内部,在实际编译的时候,内部类编译成Outer.Inner,这说明内部类所处的位置和外部类中的方法处在同一个等级上,外部类中的方法中的变量或参数只是方法的局部变量,这些变量或参数的作用域只在这个方法内部有效。因为编译的时候内部类和方法在同一级别上,所以方法中的变量或参数只有为final,内部类才可以引用。 
      

  2.   

    定义在和局部内部类同一个代码块中的局部变量中只有final型的才能被局部内部类访问
    你的TextField 定义在和匿名内部类ActionListener同一个方法(ActionWindow)的内部,所以必须把TextField 用final修饰
    而你把它定义为TestWindow 的属性的时候,就不是和匿名内部类在一个代码块中了,外部类的所有属性对所有内部类都是可见的
      

  3.   

    同一个类中 Final类型的变量才能被内部类或者匿名类使用
      

  4.   

    一楼的哥们说的很好,但是,有个问题,既然方法中的变量是局部变量,那为什么加上final关键字之后,就能当做成员变量来用呢?能告诉我其中的原理么?谢谢?
      

  5.   

    匿名内部类是出现在一个方法的内部的,如果它要访问这个方法的参数或者方法中定义的变量,则这些参数和变量必须被修饰为final。因为虽然匿名内部类在方法的内部,在实际编译的时候,内部类编译成Outer.Inner,这说明内部类所处的位置和外部类中的方法处在同一个等级上,外部类中的方法中的变量或参数只是方法的局部变量,这些变量或参数的作用域只在这个方法内部有效。因为编译的时候内部类和方法在同一级别上,所以方法中的变量或参数只有为final,内部类才可以引用。
    这个说得很好。