最近做一个项目 遇到一个final问题,自己怎么想都想不明白,于是随便写一个测试程序出现了一下结果主要目的是检测final在这里的作用,我按下四个Button分别输出0,1,2,3——代码如下:
package test;
import java.awt.Button;
import java.awt.Frame;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class test extends Frame{
public static void main(String args[]){
test a = new test();
Panel p = new Panel();
a.setSize(200, 400);
a.setVisible(true);

for(int i=0;i<4;i++){
final int fin = i;
Button m = new Button(String.valueOf(i));
m.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.out.println(fin);
}
});
p.add(m);
a.add(p);
}

} public test(){
super();
}
}
在这里有一个循环,定义了4个按钮,每个按钮按下输出不同数字。我奇怪的是没做一个循环时定义一个final量,4个循环出现4个final,而且它们的名字都叫fin,那么这四个fin不会冲突吗?或者说他们在整个程序运行期间都会共存吗?按照我最开始的想法是没个循环结束之后这个量应该不存在了啊?
实在想不懂这个问题,求助!!!javafinal

解决方案 »

  1.   

    final类型的局部变量就是添加了final修饰符的局部变量,一旦赋值就不能改变,但如果创建时没有对其赋值,那么在使用前还是可以对其赋值的。final int fin = i;
    Button m = new Button(String.valueOf(i));
    m.addActionListener(new ActionListener(){
        @Override
        public void actionPerformed(ActionEvent e) {
            // TODO Auto-generated method stub
            System.out.println(fin);
        }   
    });
    每次进循环时,fin都相当于定义一个新的fin,会覆盖掉前面的那个fin,不存在冲突
      

  2.   

    意思是说覆盖了前面的  但是前面顶一个final还可以正常使用对吗?  因此我才可以按下按钮显示不同数字?
      

  3.   

    Button m = new Button(String.valueOf(i));
    你的按钮本身是排序的,有i对应的,也就是说每个Button后面,就已经保定了一个fin,值就是i
      

  4.   

    Button m = new Button(String.valueOf(i));
                m.addActionListener(new ActionListener(){
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        // TODO Auto-generated method stub
                        System.out.println(fin);
                    }    
                });
    我的按钮上的i的作用只是为了显示按钮的标号而已啊  我可以改成其他任何东西吧?比如dog cat之类
    而我的输出是循环里定义的fin啊。
    http://www.iteye.com/problems/74026
    刚看了这个帖子,那就是说每次循环都会出现一个新的final型,每个button中的匿名类指向它对应的那个fin,JVM会有4个final型,但是叫做fin这个名字的只有最后一个。左移按下button之后分别打印不同的fin常量,前3个final也没有消亡——我觉得这个解释合理一些,你觉得呢?
      

  5.   

    在这里有一个循环,定义了4个按钮,每个按钮按下输出不同数字。我奇怪的是没做一个循环时定义一个final量,4个循环出现4个final,而且它们的名字都叫fin,那么这四个fin不会冲突吗?=====================怎么会冲突呢!?你定义了4个final的局部变量,一点冲突都没有,而且毫无关系!
      

  6.   

    简单说把final定义到主函数外面!~