Java内部类字段可见性分析
代码
public class OuterClass {
private static String a = "这是静态字段";
private String b = "这是非静态字段";
public static void method01(){
System.out.println(a);
// System.out.println(b);
// System.out.println(c);
// System.out.println(d);
// System.out.println(e);
// System.out.println(f);
}
public void method02(){
System.out.println(a);
System.out.println(b);
// System.out.println(c);
// System.out.println(d);
// System.out.println(e);
// System.out.println(f);
}
public class InnerClass{
//非静态内部类中不允许存在静态字段
//private static String c = "这是非静态内部类静态字段";
private String d = "这是非静态内部类非静态字段";
public void method03(){
System.out.println(a);
System.out.println(b);
System.out.println(d);
// System.out.println(e);
// System.out.println(f);
}
}
public static class StaticInnerClass{
private static String e = "这是静态内部类静态字段";
private String f = "这是静态内部类非静态字段";
public static void method05(){
System.out.println(a);
// System.out.println(b);
// System.out.println(d);
System.out.println(e);
// System.out.println(f);
}
public void method06(){
System.out.println(a);
// System.out.println(b);
// System.out.println(d);
System.out.println(e);
System.out.println(f);
}
}
}
public static void main(String[] args) {
OuterClass a = new OuterClass();
OuterClass.InnerClass b = a.new InnerClass();
OuterClass.InnerClass c = a.new InnerClass();
OuterClass.StaticInnerClass d = new OuterClass.StaticInnerClass();
OuterClass.StaticInnerClass e = new OuterClass.StaticInnerClass();
System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println(d);
System.out.println(e);
}
执行结果
内部类.OuterClass@1b6d3586
内部类.OuterClass$InnerClass@4554617c
内部类.OuterClass$InnerClass@74a14482
内部类.OuterClass$StaticInnerClass@1540e19d
内部类.OuterClass$StaticInnerClass@677327b6
分析
- 外部类不能看到内部类的字段,内部类之间也不能看到对方的字段,内部类可以看到外部类的字段,非静态内部类可以看到外部类的静态和非静态字段,而静态内部类只能看到外部类的静态字段
- 非静态内部类中不能存在
static
标记的字段和方法,也不能存在静态代码块 - 非静态内部类需要通过外部类的对象才能初始化,可以被子类继承
造成静态内部类与非静态内部类字段可见性差异的,主要是static
修饰内部类时造成内部类的初始化是否依赖与外部类的初始化,静态内部类初始化是通过new 外部类.内部类()
的方式,并不需要外部类对象的参与,所以在静态内部类中就无法直接访问外部类的非静态方法与字段;非静态内部类的初始化是通过new 外部类().new 内部类()
的方式,必须要外部类对象的参与,内部类对象与外部类对象绑定,相当于外部类对象的一个字段,因此可以访问外部类的任意方法和字段,又由于非静态内部类必须与外部对象绑定才能初始化,所以非静态内部类不可以有任何的static
修饰的字段/方法/代码块。