最近做一个项目 遇到一个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
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
解决方案 »
- 使用JFreeChart制作图表,但是鼠标移动屏幕就闪一下,public void update(Graphics g){paint(g)}不能消除求高手指教
- JAVA 实现QQ登录后的面板 实现好友分类标签伸缩功能
- 请教《Thinking in java》一道练习题
- 谁知道AnchorLayout是啥?
- 简单sql的问题
- 一个关于finalize的问题 请高手赐教!!
- 这段代码运行是问题多多,哪位大虾指点则个!!
- 100分求《Java 2图形设计》卷I:AWT 的CDROM中的源代码1
- 继续小弟我昨天问题:最多50天跟2个老师做J2EE项目,能跟上吗?
- 请高手看一看!是怎么回事?
- 求助求助,java线程的生产者和消费者关系 需要先生产,后消费。
- coursename有数据怎么打印不出来
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,不存在冲突
你的按钮本身是排序的,有i对应的,也就是说每个Button后面,就已经保定了一个fin,值就是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也没有消亡——我觉得这个解释合理一些,你觉得呢?