非静态内部类 ( B )
class A {
class B {
// 非静态内部类
}
}
- 依赖外部类实例:
非静态内部类 B 需要一个外部类 A 的实例来创建。
语法上,创建非静态内部类的实例需要先创建外部类的实例。
非静态内部类在外部类实例化时也不会被自动实例化。非静态内部类的实例化仍然需要显式地创建,而不是随着外部类的实例化自动发生。
A a = new A();
A.B b = a.new B();
-
隐式引用:
非静态内部类 B 持有对它的外部类 A 实例的隐式引用,也就是可以访问外部类的所有成员变量和方法,包括私有成员。 -
编译后的字节码文件:
非静态内部类 B 的字节码文件命名为 A$B.class。
静态内部类 ( C )
class A {
static class C {
// 静态内部类
}
}
- 不依赖外部类实例:
静态内部类 C 不需要外部类 A 的实例来创建。
语法上,创建静态内部类的实例不需要先创建外部类的实例。
静态内部类在外部类实例化时不会被实例化。静态内部类的实例化与外部类的实例化是独立的。静态内部类类似于外部类,可以直接通过 外部类.内部静态类 来引用和创建实例,而不需要外部类的实例。
A.C c = new A.C();
-
没有隐式引用:
静态内部类 C 没有对外部类 A 实例的隐式引用。
只能访问外部类的静态成员,不能直接访问外部类的实例成员。 -
编译后的字节码文件:
静态内部类 C 的字节码文件命名为 A$C.class。