内部类要点记录
编译
- 内部类只是一个编译时概念,一旦我们编译成功,就会成为完全不同的两个类。对于一个名为Outer的外部类和其内部定义的名为Inner的内部类。编译完成后会出现Outer.class和Outer$Inner.class两个类的字节码文件。
- Java程序从源文件创建到程序运行要经过两大步骤:1、源文件由编译器编译成字节码(ByteCode) 2、字节码由java虚拟机解释运行。因为java程序既要编译同时也要经过JVM的解释运行。所以编译比运行早。
综合以上,得出结论:内部类编译成class文件与new无关,new在jvm运行class文件时才起效。
所以会导致以下结果:
public class Out {
public void test(String a) {
class In{
public void function() {
//下面的变量a会报这个错:
//Local variable a defined in an enclosing scope must be final or effectively final
System.out.println(a);
}
}
a="hello";
new In().function();
}
public static void main(String[] args) {
new Out().test("hi");
}
}
这样调用内部类方法时会造成外部类局部变量和内部类中对应的变量的不一致,导致代码报错。因此不能修改变量a的值.