黑马程序员技术交流社区
标题:
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
你这是匿名内部类使用局部变量的问题了
你可以看看毕老师第XX天关于内部类和匿名内部类的说明。
还有,这里有个代码编辑标示功能,你这样直接贴上来看得好累啊
就像这样....
catch (Exception e1){
e1.printStackTrace();
代码会着色的,是不是很好玩,呵呵
复制代码
作者:
欧阳文愿
时间:
2011-11-10 10:26
是变量的作用域的问题,因为内部类是出现在一个方法的内部的,如果它要访问这个方法的参数或者方法中定义的变量,则这些参数和变量必须被修饰为final。因为虽然内部类在方法的内部,但实际编译的时候,内部类编译成Outer.Inner,这说明内部类所处的位置和外部类中的方法处在同一个等级上,外部类中的方法中的变量或参数只是方法的局部变量,这些变量或参数的作用域只在这个方法内部有效。因为编译的时候内部类和方法在同一级别上,所以方法中的变量或参数只有为final,内部类才可以引用。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2