A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

向庚平

初级黑马

  • 黑马币:0

  • 帖子:11

  • 精华:0

© 向庚平 初级黑马   /  2013-6-25 19:17  /  1278 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

我先举个例子


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

4 个回复

倒序浏览
是的,我开始看那里也觉得不对劲。但是他说只有t有问题,我学的不扎实,以为那样写也没问题呢。原来是匿名内部类调用的时候才会出问题,受教了。
回复 使用道具 举报
       }); //这个东西是不是有问天,,,

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

楼主系统学习下,不要太依赖ide了,,
回复 使用道具 举报
原来是我眼花了,,呵呵,,
回复 使用道具 举报
万琪 发表于 2013-6-25 20:39
原来是我眼花了,,呵呵,,

你吓我啊{:soso_e127:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马