黑马程序员技术交流社区

标题: final变量的迷惑——求解 [打印本页]

作者: 张志东    时间: 2011-11-9 23:15
标题: final变量的迷惑——求解
先上代码:
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的变量?


作者: 郭学文    时间: 2011-11-9 23:28
  1. 你这是匿名内部类使用局部变量的问题了

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

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




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