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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张志东 黑马帝   /  2011-11-9 23:15  /  2025 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

先上代码:
import java.awt.*;
import java.awt.event.*;
import java.io.*;


public class TextNot {


        public static void main(String[] args)  {
               
                start();
               
        }
         static void start(){
                final Frame f = new Frame("记事本");//我的问题就在这一行
               
                MenuBar mb = new MenuBar();
                Menu m = new Menu("文件");
                Menu m1 = new Menu("编辑 ");
                MenuItem open = new MenuItem("打开");
                MenuItem esc = new MenuItem("退出");
                final TextArea ta = new TextArea();//我的问题就在这一行
                f.setVisible(true);
                f.setBounds(400, 200, 500, 400);
                f.addWindowListener(new MyWinLis());
                f.setMenuBar(mb);
                f.add(ta);
                mb.add(m);
                mb.add(m1);
                m.add(open);
                open.addActionListener(new ActionListener(){
                        public void actionPerformed (ActionEvent e) {
                                FileDialog fd = new FileDialog(f,"打开文件",FileDialog.LOAD);
                                //fd.setBounds(50, 50, 50, 50);
                                fd.show();
                                String fileName = fd.getFile();
                                String dir = fd.getDirectory();
                                System.out.println(fileName);
                                BufferedReader bf = null;
                                String tem ="";
                                try{
                                         bf = new BufferedReader(new FileReader(dir+fileName));
                                         ta.setText("");//在这一行提示的
                                         while((tem = bf.readLine())!=null){
                                                        ta.append(tem+"\r\n");
                                                }
                                } catch (Exception e1){
                                        e1.printStackTrace();
                                }
                               
                               
                        }
                });
        }
}

class MyWinLis extends WindowAdapter{
       
         public void windowClosing(WindowEvent e) {
                 System.exit(0);
         }
         
}
问题:如果把Frame f和 TextArea ta声明前的final去掉以后为什么eclipse老是提示需要用final的变量?

2 个回复

倒序浏览
  1. 你这是匿名内部类使用局部变量的问题了

  2. 你可以看看毕老师第XX天关于内部类和匿名内部类的说明。
  3. 还有,这里有个代码编辑标示功能,你这样直接贴上来看得好累啊
  4. 就像这样....
  5. catch (Exception e1){
  6.                                         e1.printStackTrace();
  7. 代码会着色的,是不是很好玩,呵呵
  8.  
复制代码

评分

参与人数 1技术分 +1 收起 理由
宁超 + 1

查看全部评分

回复 使用道具 举报
是变量的作用域的问题,因为内部类是出现在一个方法的内部的,如果它要访问这个方法的参数或者方法中定义的变量,则这些参数和变量必须被修饰为final。因为虽然内部类在方法的内部,但实际编译的时候,内部类编译成Outer.Inner,这说明内部类所处的位置和外部类中的方法处在同一个等级上,外部类中的方法中的变量或参数只是方法的局部变量,这些变量或参数的作用域只在这个方法内部有效。因为编译的时候内部类和方法在同一级别上,所以方法中的变量或参数只有为final,内部类才可以引用。

评分

参与人数 1技术分 +1 收起 理由
宁超 + 1

查看全部评分

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