1)static Type access$iii(Outer); 是JAVA编译器自动生成的十分重要的方法(该方法的个数由你的内部类要访问的外部类的变量个数相关),目的是:用于内部类访问外部类的数据成员时使用.
2)因此:JAVA编译器在生成内部类的访问外部类的数据成员时,会自动生成代码来调用这个方法.
以你的代码为例:内部类Inner中的方法
public int getDate() {
return xx;
}
生成的代码如下:(经javap 处理后)
public int getDate(); LineNumberTable: line 12: 0 Code: Stack=1, Locals=1, Args_size=1 0: aload_0 1: getfield #1; //Field this$0:LOuter; 4: invokestatic #3; //Method Outer.access$000:(LOuter;)I 7: ireturn
class Outer { private final int xx = 123; //由于是final,故不再自动生成access$000(Outer); public Inner getInner() { return new Inner(); } public class Inner { public int getDate() { return xx; } } //class Inner static int access$000(Outer)//这个是自已定义的! { return 1; }
public class Test1 { public static void main(String[] args) { System.out.println(Outer.access$000(new Outer())); //这个调用是没有问题的,因为是自己定义的! } }
class Outer { private int xx = 123; //由于不是final,故自动生成access$000(Outer); public Inner getInner() { return new Inner(); } public class Inner { public int getDate() { return xx; } } //class Inner /*将这个第一步中自己定义的access$000去掉,因为编译器会自动生成它! static int access$000(Outer { return 1; } */