Java是当今最流行的面向对象编程语言之一。由于它是独立于平台的,因此您可以在每种类型的设备和每个操作系统上找到 Java 应用程序。而且由于Java相对容易学习,因此它是许多程序员学习的第一批语言之一。
您应该熟悉的 Java 的一个重要特性是类继承。继承允许程序员通过促进类重用来优化代码。如果可以重用已经过测试和调试的代码,软件开发生命周期将变得更短且成本更低。
虽然理论上是一个简单的概念,但编码继承关系需要注意细节。对于多重继承尤其如此,其中单个子类从多个父类继承属性。
Java拒绝多重继承关系,因为它们会产生歧义,但是如果您知道该怎么做,有几种方法可以实现许多相同的效果。
在本文中,我们将研究多重继承的问题,并讨论Java中的替代编码选项。
继承术语
有时,要成为一名成功的程序员,你必须学会解决问题,以便找到常见错误或问题的解决方法。这是安全智能编码的必要部分。
其中一个问题涉及Java中的多重继承(或者更确切地说,缺乏多重继承)。
要完全理解 Java 中的继承,您需要熟悉基本的面向对象编程 (OOP) 继承术语。
类: 类是面向对象编程语言中的基本模板结构。类定义一组对象的公共属性。
父类:父类也称为基类或超类,是为子类提供功能的可扩展类。这就是可重用性发挥作用的地方。创建子类时,将重用父类定义和函数。
儿童班:更一般地称为子类,子类从另一个类继承特征。子类是扩展类或派生类。
遗产:父类和子类之间的关系。
输出读取继承类型
目前有许多流行的面向对象编程语言在使用,包括 Java、C++、JavaScript、Python、PHP、Ruby 和 Perl。虽然继承是这些 OOP 语言的常见概念,但并非所有继承类型都存在于每种语言中。
了解您正在使用的特定语言中的一般继承类型和继承限制至关重要。您对继承的了解越多,您就越能有效地成为一名软件开发人员。
Java 支持的继承类型包括:
单级继承:当子类从单个父类派生功能时。
多级继承:这是单级继承的分层形式。在多级继承中,子类还可以充当其他子类的父类。每个级别之间的关系都是线性的 - 没有分支像多重继承那样延伸到上面。然后,最终的子类具有其上方每个级别的功能。
分层继承:与多重继承相反。在分层继承中,单个父类具有多个子类。因此,它不是在上面有分支,而是在下面分支。
混合继承:顾名思义,混合继承是其他继承类型的组合。
除了上面的继承类型之外,Java 还支持其他类型。
多重继承:在多重继承中,一个子类具有多个父类。虽然 Java 和 JavaScript 不支持多重继承,但 OOP 语言(如C++支持多重继承)
多路径继承:多级、多级和分层继承的混合体,在多路径继承中,子类从父类和父类的多个子类派生其特性和功能。因为多路径继承依赖于多重继承,所以 Java 不支持它的使用。
为什么 Java 不支持多重继承
多重继承的主要问题是,它有可能在子类中产生歧义。在1995年的概述白皮书中,Java首席设计师詹姆斯·高斯林(James Gosling)指出,多重继承的问题是创建Java的动机之一。
多重继承所固有的困难在钻石问题中表现得最为明显。在菱形问题中,父类 A 有两个不同的子类 B 和 C;也就是说,子类 B 和 C 扩展了类 A。
现在我们创建一个新的子类 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中的多重继承问题
仅仅因为多重继承有问题并不意味着它没有用。在许多情况下,您可能希望一个类具有来自其他多个类的功能。
想想当你成为一个非常成功的软件开发人员时,你会买到特斯拉跑车。它将从跑车类和电动汽车类中汲取特征。
或者,也许您正在使用私有浏览器阅读本文,该文章具有在线数据隐私解决方案类和常规 Internet 浏览器类的功能。
但是你不能在Java中扩展多个类。那么Java如何处理多重继承问题呢?
好吧,它使用称为接口的结构。接口是抽象类型,用于指定要实现的类的行为。由于它们是抽象的,因此接口不包含有关其行为的详细说明。相反,这些类提供了接口行为的具体实现。
接口具有以下几个定义特征:
与类不同,您不实例化接口。相反,类实现接口
接口仅包含公共常量定义和方法标头
接口只能扩展其他接口,而不能扩展类
接口可以扩展多个接口,类可以实现多个接口
现在,我们可以有效地绕过接口的菱形问题。回想一下,只有接口只能扩展其他接口,并且任何需要多个继承特征的类都必须实现多个接口,我们可以重新定义菱形问题类。
以前的类 A、B 和 C 现在变成了接口 A、B 和 C.接口 B 和 C 仍然扩展了接口 A,但这些接口中没有具体的函数,只有定义的行为。类 D 仍然是一个类,它负责接口 B 和 C 中的行为的具体实现。
请注意此处的一个关键区别:D 类不是扩展接口 B 和 C。相反,它正在实施它们。因此,您实际上没有多重继承。相反,你只是重新定义了问题。
了解继承对于任何有效的编码人员都是必要的。对于 Java 程序员来说,了解继承的局限性以及针对传统多重继承问题的内置 Java 解决方法同样重要。
学习如何在Java中放置接口以重新创建多重继承的效果将提高您的效率和可雇用性。