探究为何非静态内部类不能有静态成员
首先要弄清楚非静态内部类的概念。
非静态内部类如下:
public class Outer {class Inner {//public static int si = 1;错误,不允许存在静态的内部成员public static final int i = 1;}public static void main(String[] args) {Outer outer = new Outer(); //错误非静态内部类的创建必须要有一个外部类的实例//Outer.Inner inner = new Outer.Inner(); Outer.Inner inner = outer.new Inner();//正确System.out.println(Outer.Inner.i);//正确}}
public static final int i = 1;
// 堆栈:4,局部:3 public static void main(java.lang.String[] args); 0 new Outer [1] 3 dup 4 invokespecial Outer() [16] 7 astore_1 [outer] 8 new Outer$Inner [17] 11 dup 12 aload_1 [outer] 13 dup 14 invokevirtual java.lang.Object.getClass() : java.lang.Class [19] 17 pop //这里也说明了,Inner初始化时候需要一个Outer的实例, // 隐含的需要Outer参数的构造函数 18 invokespecial Outer$Inner(Outer) [23] 21 astore_2 [inner] //获取输出流(控制台) 22 getstatic java.lang.System.out :java.io.PrintStream [26] 25 iconst_1//明显被编译器替换成常量了,这里意思是将常量1传入寄存器 //以寄存器中的int值作为参数,调用println方法 26 invokevirtual java.io.PrintStream.println(int) : void [32] 29 return