日期:2014-05-20  浏览次数:20761 次

java中的final问题 类似于生命周期的问题
最近做一个项目 遇到一个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不会冲突吗?或者说他们在整个程序运行期间都会共存吗?按照我最开始的想法是没个循环结束之后这个量应该不存在了啊?
实在想不懂这个问题,求助!!!
java final

------解决方案--------------------
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,不存在冲突
------解决方案--------------------
变量命一样,内存地址不一样。