Java中的内部类与子类

时间:2015-10-29 17:58:22

标签: java inheritance inner-classes

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

子类通常可以访问标记为public和protected的所有字段/方法。可以使用getter方法在子类中访问父类中标记为private的字段。基于我迄今为止看到的内容,当方法被标记为私有时,它们通常在类的其他方法中被调用,这些方法被标记为public或protected。当然,我不是一个经验丰富的Java程序员,但这似乎是大势所趋。

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

5 个答案:

答案 0 :(得分:5)

如果使用继承,则定义" is-a"两个班级之间的关系。也就是说,ChildClass ParentClass

另一方面,内部类并不总是与外部类直接相关。拥有内部类的主要原因是外部类使用其功能而不让其他类知道它。

我能想到的最好的例子是LinkedList。它使用某种私有Node类来存储每个元素的内容。当然,单个Node不是LinkedList ...但LinkedList除非NodesLinkedList组成,否则无法正常工作。除了Node之外,任何类都没有理由知道var listItemCode类存在。

答案 1 :(得分:4)

内部类和子类之间存在很大差异:

  • 内部类位于相同的文件中,而子类可以位于另一个文件中,可能位于另一个包中。
  • 如果没有包含它的类的实例,则无法获取内部类的实例。
  • 内部类具有他们想要的方法,而子类具有其父类的方法。子类当然可以定义其他方法,但它们总是具有父级的方法。

关于情况:

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

答案 2 :(得分:1)

这很简单..但内部类和子类不一样..

子类在具有继承逻辑时使用。例如,Rectangle是Shape,因此:Rectangle可以从Shape

继承

当您拥有只需要在特定类中使用的类时,将使用内部类。这样,除非他在需要使用内部类的类中,否则没有人会使用该类。 例如: 你有A班 A类有一张地图。 Key类是您创建的用于定义复合键类的类,它仅在A内部使用。所以Key可以是内部类。这样您可以减少文件(Classes),以便其他开发人员不需要处理和理解,除非他正在使用A

希望有意义

答案 3 :(得分:0)

子类继承了它的父类'变量和方法,而内部类则没有。

因此,当子类应该拥有它的父成员时,你会想要使用子类,当你只需要它来执行它时,你可以使用内部类。

例如,您将在名为List的类中使用名为Node的内部类,以便您可以将Node用作成员。

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

答案 4 :(得分:-1)

子类基本上共享一个" is-a"与其父母的关系,而内部类共享一个" has-a"关系。例如, 我们有类蛋黄,这是蛋的内部类 上课,然后我们说Egg class"有一个"蛋黄类。的目标 蛋黄类可能是Egg类的成员,但有 没有他们的功能的链接。另外,假设我们有类延伸类动物, 所以Dog class"是一个"动物类和狗类 将继承Animal的所有功能,并可能还有更多功能。