黑马程序员技术交流社区

标题: java中一个许多的人都不注意的小细节 [打印本页]

作者: 向庚平    时间: 2013-6-25 19:17
标题: java中一个许多的人都不注意的小细节
我先举个例子


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的基础知识和一些重要的细节


作者: 王靖远    时间: 2013-6-25 19:27
是的,我开始看那里也觉得不对劲。但是他说只有t有问题,我学的不扎实,以为那样写也没问题呢。原来是匿名内部类调用的时候才会出问题,受教了。
作者: 万琪    时间: 2013-6-25 20:37
       }); //这个东西是不是有问天,,,

另外,,改掉awt.*吧,,

楼主系统学习下,不要太依赖ide了,,

作者: 万琪    时间: 2013-6-25 20:39
原来是我眼花了,,呵呵,,
作者: 向庚平    时间: 2013-6-25 22:12
万琪 发表于 2013-6-25 20:39
原来是我眼花了,,呵呵,,

你吓我啊{:soso_e127:}





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2