Static Nested Class 和 Inner Class的不同

发布时间:2024年01月05日

在Java中,内部类(Inner Class)和静态内部类(Static Nested Class)有一些关键的区别。以下是它们的主要区别:

  1. 实例化

    • 内部类:每次创建外部类的实例时,都会隐式地创建一个内部类的实例。
    • 静态内部类:每次创建外部类的实例时,并不隐式地创建一个静态内部类的实例。相反,您需要使用OuterClass.StaticNestedClass的方式来显式地创建静态内部类的实例。
  2. 访问外部类的成员

    • 内部类:可以访问外部类的所有成员(包括私有成员)。
    • 静态内部类:只能访问外部类的静态成员。
  3. 关联性

    • 内部类:与一个外部类的实例关联。
    • 静态内部类:与外部类的类型关联,而不是与外部类的实例关联。
  4. 关键字

    • 内部类:可以使用new关键字来创建其实例,如new OuterClass.InnerClass()
    • 静态内部类:使用new关键字来创建其实例时,需要使用外部类的类型,如new OuterClass.StaticNestedClass()
  5. 没有外部类的上下文

    • 对于静态内部类,即使删除static关键字,它仍然是一个静态内部类,因为它的定义不依赖于外部类的实例。这意味着即使没有创建外部类的实例,也可以创建静态内部类的实例。
  6. 生命周期

    • 内部类:它的生命周期与外部类的实例相同。当外部类的所有实例都消失时,内部类也会被垃圾回收。
    • 静态内部类:它的生命周期与外部类相同。当外部类被加载到JVM时,静态内部类就已经存在了。
  7. 使用场景

    • 内部类:通常用于封装与外部类紧密相关的逻辑。它可以直接访问外部类的所有成员。
    • 静态内部类:通常用于与外部类的类型相关的独立逻辑。它不能直接访问外部类的非静态成员。
  8. 匿名内部类

    • 匿名内部类是一种没有名称的特殊类型的内部类,用于实现接口或扩展现有类并立即实例化。它是唯一的在声明的同时进行实例化的Java代码块。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 首先,我们定义一个外部类OuterClass,其中包含一个静态内部类StaticNestedClass和一个普通内部类InnerClass:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? public class OuterClass { ?
      ? ? private String outerVariable = "Outer"; ?
      ??
      ? ? public static class StaticNestedClass { ?
      ? ? ? ? private String nestedVariable = "Nested"; ?
      ??
      ? ? ? ? public String getNestedVariable() { ?
      ? ? ? ? ? ? return nestedVariable; ?
      ? ? ? ? } ?
      ? ? } ?
      ??
      ? ? public class InnerClass { ?
      ? ? ? ? private String innerVariable = "Inner"; ?
      ??
      ? ? ? ? public String getInnerVariable() { ?
      ? ? ? ? ? ? return innerVariable; ?
      ? ? ? ? } ?
      ? ? } ?
      }?现在,我们将使用OuterClassStaticNestedClassInnerClass的实例:? ? ? ? ? ? ? ? ??public class Main { ?
      ? ? public static void main(String[] args) { ?
      ? ? ? ? OuterClass outer = new OuterClass(); ?
      ? ? ? ? OuterClass.StaticNestedClass nested = new OuterClass.StaticNestedClass(); ?
      ? ? ? ? OuterClass.InnerClass inner = outer.new InnerClass(); // 创建内部类的实例时需要外部类的实例 ?
      ??
      ? ? ? ? System.out.println("Outer variable: " + outer.outerVariable); // 输出 "Outer variable: Outer" ?
      ? ? ? ? System.out.println("Nested variable: " + nested.getNestedVariable()); // 输出 "Nested variable: Nested" ?
      ? ? ? ? System.out.println("Inner variable: " + inner.getInnerVariable()); // 输出 "Inner variable: Inner" ?
      ? ? } ?
      }? ?在这个例子中,我们创建了OuterClassStaticNestedClassInnerClass的实例,并分别访问它们的成员变量和成员方法。请注意,创建内部类的实例时需要外部类的实例。
文章来源:https://blog.csdn.net/zz_ll9023/article/details/135307942
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。