final的用法 为什么在方法体内的事件监听器内使用的变量必须是final?final事件监听器 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这个是一个规则,就好比静态方法里面如果用全局变量,必须也得用静态变量一样,主要是jdk 发布的时候就进行了规定,此外编译器也自动规定了,如果不用final 就会报错 这的确是一个规则,但是有它的理由。看这种形式:interface Listener { void onEvent (Object e);}class Test { private static int staticVariable = 20; private int variable = 5; public static void main (final String[] args) { final int stackVariable = 10; Listener listener = new Listener() { @Override public void onEvent(int val) { if (val != stackVariable) variable = e; else staticVariable = e; } } listener.onEvent(8); }}注意这里的variable并不是final,而stackVariable才必须是final。原因是,variable是存在于堆内,stackVariable是在栈里。当new Listener() {...}执行之后,stackVariable的值就被复制进了onEvent的栈中。如果stackVariable被改动,onEvent内的引用也不会被改动,因为值是复制关系,有点像函数的按值传递。如果stackVariable不是final,代码就会产生混乱。而variable的引用之所以不用final,是因为variable其实就是this.variable,而this是永远不会变的,因此也不会有混乱:variable改变之后,Listener内的variable也会跟着改。最后再看staticVariable。道理跟variable类似,只不过这里的statciVariable可以看成Test.staticVariable,Test是一个指向类的指针,它永远不会改变,所以staticVariable也不需要final。 这样理解,监听器的方法是在一定条件下才能触发,而外部代码被触发的可能性肯定要高于监听器内部的,所以,如果不把监听器内部的变量声明为final的,那就有可能出现,监听器代码触发运行中,外部代码修改变量的值,导致数据出现错误,为了避免这个问题,jdk直接强制要求final,从根本上杜绝这个问题 java中有没有像C#中分部类那样的方法 实例化初始器,大家听过吗?有用吗? 关于java的一个简单的导入问题! 求java计算八字的程序 请教jdbc批量插入的问题? 如何从JPanel输出图像到PDF? 求救!!!!!(只能使用jdk1.3.1提供的方法) adsl怎么共享上网? 这里有丰富的电脑图书下载--ojava.uhome.net 垃圾回收&内部类 ieHTTPHeaders 工具原理 ajax传递数据到后台传不过去
看这种形式:interface Listener {
void onEvent (Object e);
}class Test {
private static int staticVariable = 20;
private int variable = 5; public static void main (final String[] args) {
final int stackVariable = 10; Listener listener = new Listener() {
@Override
public void onEvent(int val) {
if (val != stackVariable)
variable = e;
else
staticVariable = e;
}
} listener.onEvent(8);
}
}
注意这里的variable并不是final,而stackVariable才必须是final。原因是,variable是存在于堆内,stackVariable是在栈里。当new Listener() {...}执行之后,stackVariable的值就被复制进了onEvent的栈中。如果stackVariable被改动,onEvent内的引用也不会被改动,因为值是复制关系,有点像函数的按值传递。如果stackVariable不是final,代码就会产生混乱。而variable的引用之所以不用final,是因为variable其实就是this.variable,而this是永远不会变的,因此也不会有混乱:variable改变之后,Listener内的variable也会跟着改。最后再看staticVariable。道理跟variable类似,只不过这里的statciVariable可以看成Test.staticVariable,Test是一个指向类的指针,它永远不会改变,所以staticVariable也不需要final。