Static Nested Class 和 Inner Class的不同

在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的实例,并分别访问它们的成员变量和成员方法。请注意,创建内部类的实例时需要外部类的实例。

你可能感兴趣的:(java,开发语言)