java中的final问题 类似于生命周期的问题

时间:2022-06-21 14:44:47
最近做一个项目 遇到一个final问题,自己怎么想都想不明白,于是随便写一个测试程序出现了一下结果
java中的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问题 类似于生命周期的问题

7 个解决方案

#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


引用 1 楼 magi1201 的回复:
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,不存在冲突

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

#3


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

#4


引用 3 楼 magi1201 的回复:
Button m = new Button(String.valueOf(i));
你的按钮本身是排序的,有i对应的,也就是说每个Button后面,就已经保定了一个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);
                }    
            });

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

#5


变量命一样,内存地址不一样。

#6


在这里有一个循环,定义了4个按钮,每个按钮按下输出不同数字。我奇怪的是没做一个循环时定义一个final量,4个循环出现4个final,而且它们的名字都叫fin,那么这四个fin不会冲突吗?

=====================

怎么会冲突呢!?你定义了4个final的局部变量,一点冲突都没有,而且毫无关系!

#7


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

#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


引用 1 楼 magi1201 的回复:
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,不存在冲突

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

#3


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

#4


引用 3 楼 magi1201 的回复:
Button m = new Button(String.valueOf(i));
你的按钮本身是排序的,有i对应的,也就是说每个Button后面,就已经保定了一个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);
                }    
            });

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

#5


变量命一样,内存地址不一样。

#6


在这里有一个循环,定义了4个按钮,每个按钮按下输出不同数字。我奇怪的是没做一个循环时定义一个final量,4个循环出现4个final,而且它们的名字都叫fin,那么这四个fin不会冲突吗?

=====================

怎么会冲突呢!?你定义了4个final的局部变量,一点冲突都没有,而且毫无关系!

#7


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