Java 中嵌套类和内部类的区别

10 Sept 2024 | 4 分钟阅读

Java 作为一门面向对象的编程语言,提供了在类中定义类的能力。这种概念允许更好地组织和封装代码。在这个上下文中,经常出现两个术语:嵌套类内部类。虽然它们有关联,但它们在 Java 编程中扮演着不同的角色。在本节中,我们将探讨这两个概念之间的区别。

嵌套类

嵌套类只是定义在另一个类中的类。包含嵌套类的外部类被称为封闭类外层类。嵌套类的关键特性是它完全独立于其封闭类。它可以访问外层类的所有成员(字段和方法),即使它们是私有的。

下面是一个嵌套类的示例

在上面的示例中,NestedClass 是 OuterClass 中的一个嵌套类。它可以直接访问 OuterClass 的 outerData 字段。

内部类

内部类是一种特殊的嵌套类。它是一个非静态的嵌套类,可以访问封闭类的所有成员,包括标记为私有的成员。这意味着内部类可以像它是外层类的一部分一样,与外层类的成员进行交互。

下面是一个内部类的示例

在此示例中,InnerClass 是一个内部类。它可以直接访问 OuterClass 的 outerData 字段。

何时使用嵌套类和内部类?

当一个类逻辑上属于封闭类但不需要访问其实例变量时,请使用嵌套类。例如,对封闭类而言是专门的实用类或数据结构。

当我们想要访问封闭类的实例变量,或者当我们想要建立内部类和外层类之间的紧密关系时,可以使用内部类

让我们创建一个包含外层类(OuterClass)、嵌套类(NestedClass)和内部类(InnerClass)的完整 Java 程序。我们将演示它们如何交互以及如何访问封闭类的成员。

OuterClass.java

输出

Data from outer class: 10
Nested class

OuterClass:它是包含实例变量 outerData 和内部类 InnerClass 的外层类。它还有一个静态嵌套类 NestedClass。

InnerClass:它是 OuterClass 中的一个内部类。它有一个 display() 方法,用于打印 outerData。

NestedClass:它是 OuterClass 中的一个静态嵌套类。它还有一个 display() 方法,用于打印一条消息。

Java 中嵌套类和内部类的主要区别

特性嵌套类内部类
访问封闭类成员它可以访问封闭类的静态成员。它可以访问封闭类的所有成员(静态和实例),即使它们是私有的。
静态与非静态它可以是静态的,也可以是非静态的。它始终是非静态的。
实例创建它可以独立于封闭类进行实例化。它需要封闭类的一个实例才能实例化。
可见性它可以具有任何可见性(public、protected、default、private)。它可以具有任何可见性,但通常是私有的,以封装其使用。

在 Java 中,嵌套类和内部类提供了一种强大的代码组织和封装方式。理解它们之间的区别对于有效使用至关重要。

嵌套类是在另一个类中定义的通用类,而内部类是非静态嵌套类,对封闭类具有特殊的访问权限。通过利用这些特性,我们可以设计出更具模块化和可维护性的 Java 程序。