JavaRush /Java 博客 /Random-ZH /喝咖啡休息#95。如何解决Java中的多重继承问题

喝咖啡休息#95。如何解决Java中的多重继承问题

已在 Random-ZH 群组中发布
来源:FreeCodeCamp Java 是当今最流行的面向对象编程语言之一。由于它是独立于平台的,因此您可以在每种类型的设备和每种操作系统上找到 Java 应用程序。而且由于Java比较容易学习,所以它是很多程序员掌握的语言之一。您应该熟悉的 Java 的一个重要特性是类继承。继承允许您优化代码,从而更轻松地重用类。当您可以重用已经经过测试和调试的代码时,软件开发生命周期就会变得更短且成本更低。 喝咖啡休息#95。 如何解决Java中的多重继承问题 - 1尽管理论上是一个简单的概念,但编码继承关系需要注意细节。特别是对于多重继承,一个子类继承多个父类的属性。Java 拒绝多重继承关系,因为它们会产生歧义,但如果您知道该怎么做,有多种方法可以实现许多相同的效果。在本文中,我们将研究多重继承的问题并讨论 Java 中的替代编码选项。

继承术语

有时,要成为一名成功的程序员,您需要成为问题解决者来找到常见错误或问题的解决方法。这是安全和智能编码的重要组成部分。其中一个问题与 Java 中的多重继承(或者更确切地说,缺乏多重继承)有关。 喝咖啡休息#95。 如何解决Java中的多重继承问题-2要完全理解 Java 中的继承,您需要熟悉面向对象编程 (OOP) 的基本继承术语。
  • 是面向对象编程语言中的基本模式结构。类定义一组对象的公共属性。
  • 父类:也称为基类或超类。父类是为子类提供功能的可扩展类。它允许重复使用。创建子类时会重用父类的定义和函数。
  • 子类:更一般地称为子类,子类继承另一个类的功能。子类是扩展类或派生类。
  • 继承:父类和子类之间的关系。

OOP继承类型

当今有许多流行的面向对象编程语言,包括 Java、C++、JavaScript、Python、PHP、Ruby 和 Perl。尽管继承是这些 OOP 语言中的常见概念,但并非所有类型的继承都存在于每种语言中。了解常见的继承类型以及您所使用的特定语言对继承的限制非常重要。您对继承了解得越多,您就会成为更高效的开发人员。Java 支持的继承类型包括:
  • 单级继承:当子类继承单个父类的功能时。
  • 多级继承:这是单级继承的多级形式。在多级继承中,子类还可以充当其他子类的父类。每个级别之间的关系是线性的 - 没有分支比多重继承更高。在这种情况下,最终的子类具有上面所有级别的函数。
  • 层次继承:与多重继承相反。在层次继承中,一个父类有多个子类。因此,它不是在上面有分支,而是在下面分支。
  • 混合继承:顾名思义,混合继承是其他类型继承的组合。
除了上面列出的继承类型之外,还有一些 Java 不支持的类型。
  • 多重继承:在多重继承中,一个子类有多个父类。虽然Java和JavaScript不支持多重继承,但C++等OOP语言却支持多重继承。
  • 多路径继承:多重、多级、分层继承的混合体,在多路径继承中,子类继承父类和父类的几个子类的特性和功能。由于多路径继承是基于多重继承的,因此Java不支持其使用。

为什么Java不支持多重继承

多重继承的主要问题是它会在子类中产生歧义。在 1995 年的白皮书中,Java 首席设计师 James Gosling 表示,多重继承的问题是创建 Java 的原因之一。多重继承固有的复杂性在钻石问题中最为明显。在钻石问题中,父类A有两个不同的子类B和C;也就是说,子类 B 和 C 扩展了类 A。 喝咖啡休息#95。 如何解决Java中的多重继承问题 - 3现在我们创建一个新的子类 D,它扩展了类 B 和类 C。请注意,我们具有多重继承(D 扩展 B 和 C)、层次继承(B 和 C 扩展A)和多级继承(D 扩展 A、B 和 C)。在钻石问题中,子类 B 和 C 继承了父类 A 的方法。B 和 C 都重写了继承的方法。但B和C中的新方法是相互矛盾的。最终的子类D从其多个父类B和C继承了两个独立且冲突的方法。不清楚应该使用类D的哪个方法,因此产生了歧义。其他OOP编程语言实现了不同的方法来解决多重继承的歧义。

如何解决Java中的多重继承问题

仅仅因为多重继承有问题并不意味着它没有用。在许多情况下,您可能希望一个类具有多个其他类的函数。想想当您成为一名非常成功的软件开发人员时您将购买的 Tesla Roadster。其技术特点基于跑车级和电动车级。另一个例子:您正在通过的浏览器阅读本文。它具有互联网隐私解决方案类和通用互联网浏览器类的功能。但你不能在 Java 中扩展多个类。那么这种语言是如何处理多重继承问题的呢?Java 使用称为接口的结构。接口是定义要由类实现的行为的抽象类型。由于接口是抽象的,因此不包含有关其行为的详细说明。相反,类提供接口行为的具体实现。接口有几个定义特征:
  • 与类不同,您不需要实例化接口。相反,类实现接口。
  • 接口仅包含公共常量定义和方法头。
  • 接口只能扩展其他接口,而不能扩展类。
  • 接口可以扩展多个接口,类可以实现多个接口。
我们现在可以使用接口有效地解决钻石问题。请记住,只有接口只能扩展其他接口,并且任何需要多重继承特性的类都必须实现多个接口,我们可以重写钻石问题类。以前的类 A、B 和 C 现在变成了接口 A、B 和 C。接口 B 和 C 仍然扩展接口 A,但这些接口都没有特定的功能,只有特定的行为。类 D 仍然是负责专门实现接口 B 和 C 中的行为的类。请注意一个关键区别:类 D 不扩展接口 B 和 C。相反,它实现了它们。这样你实际上就没有多重继承。相反,您只是重新定义了问题。

结论

理解继承对于任何高效的 Java 开发人员来说都是至关重要的。了解继承的局限性以及 Java 针对传统多重继承问题的内置解决方法也同样重要。学习如何创建接口来重现 Java 中多重继承的效果将提高您的工作效率和招聘机会。
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION