Java中的内部类与子类

Joe*_* J. 6 java inheritance inner-classes

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

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

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

Ele*_*ill 10

内部类和子类之间有很大的区别:

  • 内部类位于同一文件中,而子类可以位于另一个文件中,也可以位于另一个包中。
  • 没有包含内部类的实例,就无法获得内部类的实例。
  • 内部类具有所需的方法,而子类具有其父类的方法。子类当然可以定义其他方法,但是它们将始终具有其父类的方法。

关于情况:

  • 当您的大类需要一个(通常为短类)与内部操作相关的类时,并且没有其他人需要它时,可以使用内部类。Nik G引用的一个很好的例子是LinkedList:它需要一个Node类才能工作,这很简短,并且不需要其他类。因此,Node是LinkedList的内部类。
  • 定义“是”关系时使用子类。想象一下:您想制造不同类型的汽车。它们具有共同的特性和特征:它们可以移动,具有乘客等。因此,您可以使用这些共同的事物创建抽象类“汽车”。然后为每种不同类型的汽车创建一个子类。


Mag*_* Xy 5

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

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

最好的例子我能想到的把我的头顶部是一个LinkedList.它使用某种私有Node类来存储每个元素的内容.当然,单个Node不是LinkedList......但是LinkedList除非由它构成,否则它不能工作Nodes.除了LinkedList知道Node该类存在之外,没有其他任何类别的理由.