内嵌类

在Java中,内嵌类(Nested Class)是指定义在另一个类内部的类。内嵌类可以分为以下几种类型:

  1. 静态内嵌类(Static Nested Class)

    • 使用static关键字声明。
    • 可以直接通过外部类的类名访问,不需要创建外部类的实例。
    • 不能访问外部类的非静态成员。

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      public class OuterClass {
      static class StaticNestedClass {
      public void display() {
      System.out.println("Inside StaticNestedClass");
      }
      }
      }

      // 使用静态内嵌类
      OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();
      nestedObject.display();
  2. 非静态内嵌类(Inner Class)

    • 不使用static关键字声明。
    • 需要通过外部类的实例来创建。
    • 可以访问外部类的所有成员,包括私有成员。

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      public class OuterClass {
      private int value = 10;

      class InnerClass {
      public void display() {
      System.out.println("Value is " + value);
      }
      }
      }

      // 使用非静态内嵌类
      OuterClass outerObject = new OuterClass();
      OuterClass.InnerClass innerObject = outerObject.new InnerClass();
      innerObject.display();
  3. 局部类(Local Class)

    • 定义在方法内部的类。
    • 只能在该方法内部使用。
    • 可以访问外部类的成员和方法的局部变量(必须是final或effectively final)。

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      public class OuterClass {
      private int value = 10;

      public void method() {
      class LocalClass {
      public void display() {
      System.out.println("Value is " + value);
      }
      }

      LocalClass localObject = new LocalClass();
      localObject.display();
      }
      }

      // 使用局部类
      OuterClass outerObject = new OuterClass();
      outerObject.method();
  4. 匿名类(Anonymous Class)

    • 没有名字的局部类。
    • 通常用于实现接口或扩展类,并且只使用一次。

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      public class OuterClass {
      public void method() {
      Runnable runnable = new Runnable() {
      @Override
      public void run() {
      System.out.println("Inside anonymous class");
      }
      };

      Thread thread = new Thread(runnable);
      thread.start();
      }
      }

      // 使用匿名类
      OuterClass outerObject = new OuterClass();
      outerObject.method();

内嵌类的主要优点包括:

  • 可以实现更好的封装,将相关的类组织在一起。
  • 提高代码的可读性和可维护性。
  • 内嵌类可以访问外部类的私有成员。