分为成员内部类、局部内部类、匿名内部类和静态内部类
编译后,产生Outter$Inner.class和Outer.class文件。在编译后,内部类有个指向外部类的引用,默认有个构造器赋初值。
局部内部类就像是方法里面的一个局部变量一样,是不能有public、protected、private以及static修饰符的。
为什么局部内部类和匿名内部类只能访问局部final变量?
当外部类方法执行完毕后,局部变量生命周期就结束了,而匿名或局部内部类生命周还没有结束,所以不能访问没有final修饰的变量。Final修饰的局部变量,java采用复制手段,在匿名内部类(局部内部类)的常量池中添加一个内容相等的字面量或直接将相应的字节码嵌入到执行字节码中。这样一来,匿名内部类使用的变量是另一个局部变量,只不过值和方法中局部变量的值相等,因此和方法中的局部变量完全独立开。