//请问大家:为什么一定要将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);
}
}
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);
}
}
你的TextField 定义在和匿名内部类ActionListener同一个方法(ActionWindow)的内部,所以必须把TextField 用final修饰
而你把它定义为TestWindow 的属性的时候,就不是和匿名内部类在一个代码块中了,外部类的所有属性对所有内部类都是可见的
这个说得很好。