内部 类 与 Java 中的子类

Inner Classes vs. Subclasses in Java

是否存在使用内部 class 而不是 Java 中的子 class 更有利的情况(反之亦然)?根据我目前的理解,内部classes可以访问外部class的字段和方法。这与使用继承有何不同?

Subclasses 通常可以访问所有标记为 public 并受保护的 fields/methods。可以使用 getter 方法在子 class 中访问父 class 中标记为私有的字段。根据我目前所见,当方法被标记为私有时,通常会在标记为 public 或受保护的 class 的其他方法中调用它们。当然,我不是经验丰富的 Java 程序员,但这似乎是大势所趋。

根据我目前的理解,选择一个而不是另一个似乎没有任何好处。有人可以深入了解为什么以及何时应该使用内部 class 而不是继承(反之亦然)吗?

这个很简单..但是inner class和sub class不一样..

Sub classes 在您具有继承逻辑时使用。例如 Rectangle 是 Shape 所以: Rectangle 可以继承自 Shape

内部 class 当你有一个 class 并且你只需要特别使用 class 时使用。这样就没有人会使用class除非他在class中需要使用内部class。 例如: 你有 class 个 Class a 有一张地图。 Key class 是你创建的 class 来定义复合键 class 并且它只在 A 内部使用。所以 Key 可以是 inner class.. 这样你就可以减少files(Classes) 这样其他开发人员就不需要处理和理解,除非他使用 A

希望有意义

子class 本质上与其父级共享 "is-a" 关系,而内部 class 共享 "has-a" 关系。例如, 我们有 class 蛋黄,它是鸡蛋的内部 class class,那么我们说鸡蛋class"has a"蛋黄class。的对象 yolk class 可能是 Egg class 的一员,但是有 没有 link 他们的功能。另外,假设我们有 class Dog extends class Animal, 所以狗 class "is a" 动物 class 和狗 class 会继承Animal的所有特征,可能还有更多。

如果使用继承,则在两个 class 之间定义 "is-a" 关系。即ChildClass是一个ParentClass

另一方面,内部 classes 并不总是与外部 classes 直接相关。拥有内部 class 的主要原因是外部 class 可以在不让其他 class 知道的情况下利用其功能。

我能想到的最好的例子是 LinkedList。它使用某种私有 Node class 来存储每个元素的内容。当然,单个 Node 不是 LinkedList... 但是 LinkedList 不能工作,除非它由 Nodes 组成。除了 LinkedList 之外,任何 class 也没有理由知道 Node class 存在。

子class继承父class的变量和方法,内部class则不会。

因此,当子 class 应该拥有它的父成员时,您会想要使用子 class,而当您只需要它来执行它的部分时,使用内部 class。

例如,您可以在 class 命名列表中使用内部 class 命名节点,这样您就可以将节点用作成员。

例如,您可以在名为 class 的 Car 中使用名为 Mercedes 的子class,因为 Mercedes 应该继承 Car 的成员并在需要时覆盖 Car 的方法。

内部classes和子classes之间有很大的不同:

  • inner classes 在 same 文件中,而 subclasses 可以在另一个文件中,也许在另一个包中。
  • 如果没有包含它的 class 的实例,您将无法获得内部 class 的实例。
  • inner classes 有他们想要的方法,而 subclasses 有他们父 class 的方法。 Subclasses 当然可以定义额外的方法,但它们总是有它们父类的方法。

关于情况:

  • inner class 当你的大 class 需要一个(通常很短)class,与其内部操作相关,并且当没有其他人需要它时使用。 Nik G 引用的一个很好的例子是 LinkedList:它需要一个节点 class 才能工作,这很短,并且没有其他 class 需要。因此 Node 是 LinkedList.
  • 的内部 class
  • subclasses 在定义 "is-a" 关系时使用。想象一下:您想制造不同类型的汽车。它们具有共同的属性和特征:它们所有都可以移动,它们所有都有乘客,等等。所以你创建一个抽象class "Car" 与这些常见的东西。然后你为每种不同类型的汽车创建一个子class。