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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 黄克帅 于 2012-6-14 10:46 编辑

有两个问题  1   有时候我运行的时候TextArea  不会显示出来  不知道是不是myeclipse的bug还是代码问题
2  为什么我的TextField  和TextArea   要设置成final  下面才能访问呢?
public class test {
        public static void main(String[] args) {

                Frame f = new Frame("窗体");
                f.setSize(600, 400);// 设置宽 高
                f.setLocation(400, 150);// 设置初始位置
                // f.setBounds() 设置 坐标 宽 高
                // 设置布局方式
                f.setLayout(new FlowLayout());
                f.setVisible(true);
               
                f.addWindowListener(new WindowAdapter() {
                          public void windowClosing(WindowEvent e) {
                                  System.exit(0);
                          }
                });

                // 创建单行文本框组件
                final TextField tf = new TextField(30);
                // 把文本框组件绑定到窗体
                f.add(tf);

                Button b2 = new Button("提交");
                f.add(b2);
                // 创建多行文本框
                final TextArea ta = new TextArea(10, 80);
                f.add(ta);

                b2.addActionListener(new ActionListener() {

                        public void actionPerformed(ActionEvent e) {
                                String text = tf.getText();
                                ta.append(text+"\r\n");
                                
                                tf.setText("");

                        }
                });

        }
}

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

6 个回复

正序浏览
黄克帅 发表于 2012-6-14 00:29
我知道是匿名内部类  我想问的就是为什么 匿名内部类访问必须要设置成final ...

是变量的作用域的问题,因为匿名内部类是出现在一个方法的内部的,如果它要访问这个方法的参数或者方法中定义的变量,则这些参数和变量必须被修饰为final。因为虽然匿名内部类在方法的内部,但实际编译的时候,内部类编译成Outer.Inner,这说明内部类所处的位置和外部类中的方法处在同一个等级上,外部类中的方法中的变量或参数只是方法的局部变量,这些变量或参数的作用域只在这个方法内部有效。因为编译的时候内部类和方法在同一级别上,所以方法中的变量或参数只有为final,内部类才可以引用。
回复 使用道具 举报
黄克帅 发表于 2012-6-14 00:29
我知道是匿名内部类  我想问的就是为什么 匿名内部类访问必须要设置成final ...

因为编译程序实现上的困难

内部类对象的生命周期会超过局部变量的生命期。局部变量是当该方法被调用时,该方法中的局部变量在栈中被创建,当方法调用结束后,退栈,这些局部变量全部死亡,但是,内部类对象生命周期与其他类一样,匿名内部类是内部类的一种,当创建对象后,只有当没有其他人再饮用它时,他才能死亡。
所以,完全可能一个方法已经调用结束(局部变量已经死亡),但是该局部类的对象还活着,就是说:局部变量的生命周期要至少等于或者大于内部类对象的生命周期。
因此,局部内部类的对象可以访问被定义为final的局部变量。懂没?
回复 使用道具 举报
我知道是匿名内部类  我想问的就是为什么 匿名内部类访问必须要设置成final
回复 使用道具 举报
new ActionListener()这个是匿名类,匿名类是内部类的一种.
b2.addActionListener(new ActionListener():传入一个ActionListner接口的实现类,但这个类没有名字(匿名类),这个类实现了ActionListner接口.
内部类不能访问外部类方法中的局部变量,除非变量是final的(一般发生在方法中定义的内部类)。这是因为局部变量的生命周期原因。
回复 使用道具 举报

import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class MainClass {
    public static void main(String[] args) {

            Frame f = new Frame("窗体");
            f.setSize(600, 400);// 设置宽 高
            f.setLocation(400, 150);// 设置初始位置
            // f.setBounds() 设置 坐标 宽 高
            // 设置布局方式
            f.setLayout(new FlowLayout()); //我在运行时都可以显示到;可能和布局方式有关;
            f.setVisible(true);

            f.addWindowListener(new WindowAdapter() {
                      public void windowClosing(WindowEvent e) {
                              System.exit(0);
                      }
            });

            // 创建单行文本框组件
            final TextField tf = new TextField(30);//因为你要在内部类中用到tf.getText();所以要用final修饰;
            // 把文本框组件绑定到窗体
            f.add(tf);

            Button b2 = new Button("提交");
            f.add(b2);
            // 创建多行文本框
            final TextArea ta = new TextArea(10, 80);
            f.add(ta);

            b2.addActionListener(new ActionListener() {

                    public void actionPerformed(ActionEvent e) {
                            String text = tf.getText();
                            ta.append(text+"\r\n");

                            tf.setText("");
                    }
            });

    }
}


评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 江南 于 2012-6-13 20:29 编辑

因为是匿名内部类    b2.addActionListener(new ActionListener() {}需加final才能访问
有时候我运行的时候TextArea没法显示那就 不是程序问题了!

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 恭喜~~~~

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马