66. Java 嵌套类

70 阅读3分钟

66. Java 嵌套类

在 Java 中,嵌套类是指在另一个类内部定义的类,根据是否使用 static 修饰符,嵌套类可分为:

  1. 非静态嵌套类(内部类,Inner Class)
  2. 静态嵌套类(Static Nested Class)

定义方式如下:

class OuterClass {
    // 非静态嵌套类(内部类)
    class InnerClass {
        // 内部类内容
    }
    
    // 静态嵌套类
    static class StaticNestedClass {
        // 静态嵌套类内容
    }
}

1. 非静态嵌套类(内部类)

与外部类的关系:

  • 内部类与外部类实例相关联,可以直接访问外部类的所有成员,包括私有成员。

创建内部类实例:

OuterClass outer = new OuterClass();
OuterClass.InnerClass inner = outer.new InnerClass();

访问修饰符:

  • 内部类可被声明为 privatepublicprotected 或包级私有(无修饰符),与其他类成员一致。

用途:

  • 当内部类仅对外部类有意义,或需要访问外部类实例的非静态成员时,使用内部类可实现更紧密的封装和逻辑关联。

示例:

public class OuterClass {
    private String outerField = "外部类字段";

    // 内部类
    class InnerClass {
        void display() {
            System.out.println("访问:" + outerField);
        }
    }

    public static void main(String[] args) {
        OuterClass outer = new OuterClass();
        OuterClass.InnerClass inner = outer.new InnerClass();
        inner.display(); // 输出:访问:外部类字段
    }
}

在上述示例中,InnerClass 作为 OuterClass 的内部类,直接访问了外部类的私有字段 outerField

2. 静态嵌套类(Static Nested Class)

与外部类的关系:

  • 静态嵌套类与外部类本身关联,不依赖外部类实例;不能直接访问外部类的实例成员,若需访问,必须通过外部类对象引用。

创建静态嵌套类实例:

OuterClass.StaticNestedClass nestedObj = new OuterClass.StaticNestedClass();

访问修饰符:

  • 静态嵌套类可声明为 privatepublicprotected 或包级私有。

用途:

  • 当嵌套类不需访问外部类实例成员,但在概念或逻辑上与外部类紧密相关时,使用静态嵌套类可简化包结构,保持封装性。

示例:

public class OuterClass {
    private static String staticOuterField = "外部类静态字段";

    // 静态嵌套类
    static class StaticNestedClass {
        void display() {
            System.out.println("访问:" + staticOuterField);
        }
    }

    public static void main(String[] args) {
        OuterClass.StaticNestedClass nestedObj = new OuterClass.StaticNestedClass();
        nestedObj.display(); // 输出:访问:外部类静态字段
    }
}

在此示例中,StaticNestedClass 作为静态嵌套类,访问了外部类的静态字段 staticOuterField

3. 使用嵌套类的优势

  1. 逻辑分组: 将仅在外部类内部使用且与外部类高度相关的类嵌套在外部类中,使代码结构更紧凑、清晰,减少包中不必要的顶级类。
  2. 增强封装性:
    • 如果一个辅助类需要访问另一个类的私有成员,将其作为内部类可获得访问权限,同时对外保持隐藏,减少外部依赖。
    • 静态嵌套类也可隐藏在外部类中,起到“包装内部实现”的作用,使外部只需关注外部类,而无需了解辅助类。
  3. 便于维护: 代码更接近使用它的地方,对于小型类或仅有辅助功能的类,直接在外部类内部声明可使阅读和维护更加容易。

4. 总结

  • 内部类(非静态嵌套类): 依赖外部类实例,可以访问外部类的所有成员。对象创建需要外部类对象。
  • 静态嵌套类: 不依赖外部类实例,不能直接访问外部类的实例成员。
  • 嵌套类可使用访问修饰符(privatepublicprotected、包级私有)来控制可见性。
  • 使用嵌套类能够逻辑分组仅在外部类内部使用的类、增强封装性以及改善代码可读性。

这使得嵌套类在组织紧密相关的类或隐藏实现细节时非常有用。