package com.study;
public class Test {
public void test01(){
String m = "外部定义的方法";
class Test02{
public Test02() {
System.out.println(m);
}
}
}
public static void main(String[] args) {
}
}
如上代码报错为:Cannot refer to the non-final local variable m defined in an enclosing scope 中文为:
不能引用封闭范围中定义的非最终局部变量m
原因如下:
内部类和外部类其实是处于同一个级别,内部类不会因为定义在方法中就会随着方法的执行完毕而跟随者被销毁。问题就来了,如果外部类的方法中的变量不定义final,那么当外部类方法执行完毕的时候,这个局部变量肯定也就被GC了,然而内部类的某个方法还没有执行完,这个时候他所引用的外部变量已经找不到了。如果定义为final,java会将这个变量复制一份作为成员变量内置于内部类中,这样的话,由于final所修饰的值始终无法改变,所以这个变量所指向的内存区域就不会变。