java内部类访问局部变量时局部变量必须声明为final,同样,在线程中使用局部变量时,需将局部变量声明为final。
public class Thread2 {
private static int num = 0;
public static synchronized void printNum(String tag){
try {
if(tag.equals("a")){
num = 100;
System.out.println("tag a ,set num over");
}else {
num = 200;
System.out.println("tag b ,set num over");
}
System.out.println("tag"+tag + "num:"+num);
}catch (Exception e){
e.printStackTrace();
}
}
public static void main(String[] args) {
//两个不同对象
final Thread2 m1 = new Thread2();
final Thread2 m2 = new Thread2();
Thread t1 = new Thread(new Runnable() {
public void run() {
m1.printNum("a");
}
});
Thread t2 = new Thread(new Runnable() {
public void run() {
m2.printNum("b");
}
});
t1.start();
t2.start();
}
}
原因:
编译这个类后发现产生了3个class文件,编译后的内部类的构造方法的里面,传了对应的外部类的引用和所有局部变量的形参。
由于这些工作是在编译时进行的,JAVA虚拟机并没有什么所谓的内部类的概念,在JAVA虚拟机看来,该内部类和外部类是两个独立的class文件。
final关键字的目的就是为了保证内部类和外部函数对变量“认识”的一致性