我先举个例子
package test;
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class Test {
private Frame f;
private TextField t;
private TextArea ta;
private Button s;
Test() {
Frame f = new Frame("....");
f.setSize(300, 400);
f.setLocation(600, 300);
f.setLayout(new FlowLayout());
Button s = new Button("ok");
TextField t = new TextField(10);
TextArea ta = new TextArea(15, 20);
f.add(t);
f.add(s);
f.add(ta);
f.setVisible(true);
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
s.addMouseListener(new MouseAdapter() {
// int count=1;
// int count1=1;
public void mouseClicked(MouseEvent e) {
// System.out.println("点击第"+(count++)+"下");
String a = t.getText();
// ta.append(a);
System.out.println(a);
}
});
t.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
}
});
}
private void zhuanhuan() {
String a = t.getText();
// ta.append(a);
System.out.println(a);
}
}
这是我今天在论坛里看到的,发帖的人问 那个红色的代码为什么有问题?那个t不是定义好了?,这类型的问题我捡到过好几次了,究根揭底还是他们没注意到一个细节,那就是他们重复定义了同一个变量,在上面的例子中现在类中定义4个成员变量
private Frame f;
private TextField t;
private TextArea ta;
private Button s;
但在其构造函数中又重复定义了一次
Frame f = new Frame("....");
Button s = new Button("ok");
TextField t = new TextField(10);
TextArea ta = new TextArea(15, 20);
结果就把原先的给覆盖了,从而这四个变量变成了局部变量,从而就导致了问题的出现,因为在添加监听器的时候用的是匿名内部类,试问一下能在一个类中访问到另外一个类的局部变量吗?显然是不可以的,所以其解决办法就是在构造函数中不再声明那四个变量的类型,
将其改为
f = new Frame("....");
s = new Button("ok");
t = new TextField(10);
ta = new TextArea(15, 20);
对此我认为java的细节很重要的,我们要时不时 的复习一下java的基础知识和一些重要的细节
|
|