Java 中继承和组合的区别
在计算机编程中,“可重用代码”的概念是指在构建新软件时利用以前开发的软件。代码的可重用性被认为是高效功能的重要组成部分。面向对象编程使用的一种方法来促进这一点是建立类之间的关联。
在面向对象编程中,构建这些关系主要有两种方法:继承和组合。
在面向对象编程 (OOP) 中,继承是指一个对象可以获取一个或多个其他对象的属性的过程。在 OOP 中,它是建立代码可重用性的最强大的概念之一。使用继承时,可以通过与现有类建立父子关系来构建新类。这允许创建现有类的新的子类型。
类继承的替代方法是所谓的“对象组合”。组合是指在一个对象内使用另一个对象的过程。组合是 OOP 促成的一种新的类间关系形式。
由于通过利用先前建立的、设计良好的类作为组件来开发复杂的类很容易,因此你会发现有很多情况你希望将一个对象用作另一个类中的字段。这个过程称为“组合”。
尽管在许多情况下继承和组合提供的功能大致相似,但对象组合被认为比类继承是一种更好的重用方法。阅读本文,了解有关继承和组合的更多信息以及这两个概念有何不同。
什么是组合?
组合,也称为“has-a 关系”,是 OOP 为类提供的另一种相互关联的方式。
当一个对象的属性必须以某种方式包含在另一个对象中才能使关系有意义时,需要组合。为了从现有类创建新的组合类,必须将每个现有类的对象声明为新类的成员。
组合是将一个东西嵌套在另一个东西内的花哨说法,可以很简单地解释。在许多情况下,你希望将已定义的对象用作另一个类中的字段。在组合中,在类内工作时使用对象。
与类继承相反,对象组合是通过对象获取对其他类对象的引用在运行时动态定义的。组合之所以有益,是因为它提供了一种更好的使用对象而不破坏对象内部信息的方法。这是组合的另一个好处。
组合示例
public class Student { } public class College { private Student student; public College() { this.student = new Student(); } }
什么是继承?
在面向对象编程中实现代码可重用性时,最强大的工具之一是继承。这是一种能力,允许一个对象通过使用另一个对象来获取一个或多个其他对象的属性。
Java 允许你构建从其他类派生其属性的类。这意味着你专门化一个类以在类之间构建“is-a 关系”,这最终会导致基类和派生类之间强耦合。
由于实现继承时,新类是从现有类生成的,因此代码可重用性得到了提高。类继承使得更改被重用的实现变得容易得多。但是,类继承也有一些缺点。继承在编译时定义,因此你无法在运行时更改从父类继承的实现。
继承的性质可以是单层、多层、层次结构、多层或混合的。继承也可以采取混合继承的形式。
继承示例
class Animal{ String name="Orio"; } public class Dog extends Animal{ String type="Dog"; public static void main(String args[]){ Dog p=new Dog(); System.out.println("Name:"+p.name); System.out.println("Type:"+p.type); } }
输出
Name:Orio Type:Dog
组合和继承的比较
下表重点介绍了面向对象编程中组合和继承的主要区别:
比较依据 | 组合 | 继承 |
|---|---|---|
| 关系 | 这是一种“has-a”情况。 | 这是一种“is-a”情况。 |
| 功能 | 我们可以评估我们正在使用的类的功能,而不必担心它们是父类还是子类。 | 如果不先测试父类,就不能测试子类。 |
| 如果不先测试父类,就不能测试子类。 | 由于组合,即使在最终类中也可以重用代码。 | 继承不能用于扩展最终类的功能。 |
| 意义 | 只需声明我们想要在组合中使用的类型,就可以让它存储多个实现,每个实现根据调用的上下文具有不同的行为。 | 在继承中,我们负责定义将成为“超类”的类,并且一旦使用,此定义就是不可变的。 |
| 类组合 | 组合使用户可以灵活地将多个类的特性和功能混合到单个实体中。 | Java 不支持多重继承,这意味着不能扩展多个类。 |
结论
组合是一种聚合,其中所有权是假设的而不是明确声明的。考虑以下对象:一个与学校相关,一个与教室相关。如果没有学校对象,教室对象就不可能存在。因此,这两个对象被称为相互依赖。因此,我们可以称之为组合。换句话说,如果某些东西不可能独立于整体而存在,那么它就被称为组合。
组合,通常称为“has-a”关系,是面向对象编程为类提供的另一种相互关联的方式。如果一个对象的属性必须以某种方式包含在另一个对象中才能使关系有意义,则需要组合。为了从现有父类创建新的组合类,必须将每个类的对象声明为当前类的成员。
数据结构
网络
RDBMS
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP