Java的内部类

33 阅读2分钟

成员内部类(Member Inner Class)和静态内部类(Static Nested Class)是Java中两种不同类型的内部类,它们主要有以下几点区别:

  1. 关键字和静态性

    • 成员内部类没有使用static关键字,它与外部类的实例紧密相关联,需要外部类的实例来创建。
    • 静态内部类使用static关键字修饰,它不需要外部类的实例就可以创建。静态内部类的对象是独立于外部类对象的。
  2. 访问外部类成员

    • 成员内部类可以直接访问外部类的所有成员,包括私有成员,因为它是非静态的,所以它能够访问外部类的实例变量和方法。
    • 静态内部类只能直接访问外部类的静态成员。要访问非静态成员,它必须通过外部类的对象来访问。
  3. 使用场景和目的

    • 成员内部类通常用于与外部类有强关联的情况,它需要访问外部类的成员变量和方法。例如,当内部类像是外部类的一个组成部分,且与外部类的实例紧密相关时。
    • 静态内部类通常用于当内部类的行为不依赖于外部类的实例时,或者当你希望内部类能够作为一个独立实体存在,或者用于群组相关的类一起,这样可以更好的封装类之间的关系。
  4. 内存影响

    • 成员内部类持有对外部类实例的引用,这可能会影响外部类实例的垃圾回收,尤其是在某些复杂的引用场景中。
    • 静态内部类不持有外部类实例的引用,因此它对外部类实例的生命周期和垃圾回收影响较小。

简而言之,成员内部类与外部类的实例紧密相关,可以访问外部类的所有成员;而静态内部类作为一个独立的静态实体存在,只能直接访问外部类的静态成员。选择使用哪种内部类取决于你的具体需求,比如是否需要访问外部类的实例成员,以及是否希望内部类能够独立于外部类实例存在。