我们知道内部类可以对外部类的属性进行访问,有没有什么限制呢?
静态内部类只能访问外部类的静态属性,不能访问非静态属性,为什么?
非静态内部类对象的创建依赖于外部类对象的创建,编译器会在内部定义一个指向外部类对象的引用,同时构造器会接受一个外部类对象为参数,如果内部类有访问外部类私有属性,则会在外部类生成一个静态方法。其编译结果实际上如下:
public class OuterClass {
private String name = "java";
public static String access$0(OuterClass outer){
return outer.name;
}
}
class InnerClass{
private OuterClass outer;
public InnerClass(OuterClass outer) {
this.outer = outer;
}
public String get(){
return OuterClass.access$0(outer);
}
}
这就是为什么非静态内部类可以访问外部类的私有属性。静态部内类对象的创建不依赖于外部类对象,自然不会持有一个外部类的引用,更无法访问其实例变量。