Java 中的继承和组合的区别

2025年6月4日 | 阅读 5 分钟

继承

继承是 OOP(面向对象编程)的一个重要特性。在 Java 中,它是一种机制,其中一个对象获取父对象的所有属性和行为。

它表示“是”关系,也称为父子关系。例如,汽车一种交通工具;猫一种动物,还有很多。

在 Java 中,借助继承,我们可以创建基于现有类的类。当我们继承父类的方法和字段时,它们可以在其他类中重用。我们还可以向当前类添加新的方法和字段。

继承要点

  1. 遵循“是”关系:确保继承关系遵循“是”原则,其中子类代表超类的一个更专业化的版本。
  2. 代码重用:超类的继承成员可以在子类中重用,从而减少冗余代码并促进软件开发的模块化方法。
  3. 分层组织:继承有助于创建结构良好的类层次结构,从而提高代码的可读性和可维护性。
  4. 多态:子类可以覆盖超类方法,从而实现多态行为,其中方法可以根据运行时对象类型以不同的方式表现。
  5. 易于维护:对超类的更改会自动传播到其子类,确保一致性并简化维护工作。
  6. 方法重写:子类可以使用 @Override 来重新定义父类的方法。

阅读更多有关Java 中的继承

继承示例

让我们通过一个例子来理解 Java 中的继承概念。它将更清楚地解释这个概念。在这里,父类是 School,子类是 Student。School 类包含学生的姓名,子类包含学生的 rollno。

示例

编译并运行

输出

Student's Name: John
Student's Roll No.: 25

在上面的例子中,Student 类的对象可以访问其自身类以及 School 类的字段,即代码重用。

组合 (Composition)

组合是 Java 中的一种设计原则,其中一个类包含另一个类的实例,而不是继承它。组合是一种设计或实现“有”关系的方式。

组合要点

  1. “有”关系:组合表示“有”关系,其中一个类包含另一个类的对象而不是扩展它。
  2. 封装与重用:与继承不同,组合提供了更好的封装,减少了类之间的依赖性。
  3. 灵活设计:组合允许通过交换包含的对象在运行时动态更改行为。
  4. 依赖注入:对象可以作为依赖项传递,从而促进模块化和可测试的代码。
  5. 避免紧密耦合:组合有助于避免深层继承层次结构,从而获得更易于维护的代码。
  6. 无脆弱基类问题:继承中父类的更改可能会影响子类,而组合避免了此问题。
  7. 委托:可以通过委托在包含类中使用被包含类的对象。

尽管继承和组合都提供了代码重用,但两者之间的区别在于组合中我们不扩展类。两个对象之间的组合关系是在一个对象包含另一个对象时发生的,而该对象完全依赖于它。组合表示“部分”关系。

例如,一所房子一个客厅(客厅是房子的一部分),一个人一个心脏(心脏是人体的一部分),还有很多。

阅读更多有关Java 中的组合

组合示例

让我们通过一个例子来理解 Java 中的组合概念。它将更清楚地解释这个概念。

示例

编译并运行

输出

The car has an Engine

继承与组合

现在,让我们看看 Java 中继承和组合的比较图。我们根据一些特征来比较这两个术语。

方面继承组合 (Composition)
定义继承表示 IS-A 关系,也称为父子关系。组合是一种设计或实现“has-a”关系的方式。
可靠性在继承中,子类依赖于父类。而在组合中,子类和父类都是独立的。
可重用性在继承中,我们只能扩展一个类,因此我们只能重用一个类的代码。在组合中,我们可以使用多个类的功能。
多重继承Java 不允许多重继承。而使用组合,我们可以轻松实现多重继承。
Final 类我们不能使用继承来扩展 final 类。在组合中,我们可以重用来自 final 类的代码。
灵活性它的灵活性较低,因为父类的更改会影响子类。它的灵活性更高,因为可以在不影响包含类的情况下交换或修改对象。
封装它可能会将超类详细信息暴露给子类,导致紧密耦合。更好地封装详细信息,减少对其他类的依赖。
多重行为Java 允许单类继承,但支持多接口实现。通过组合不同的对象,可以实现多种行为。
用例当存在清晰的层级关系时使用。当我们追求更高的灵活性和可维护性时使用。

组合为我们提供了一种更好的代码重用方式,同时保护了我们正在重用的类免受任何客户端的影响。继承主要在我们需要从同一系列创建类时很重要。

继承和组合选择题

1. IS-A 关系由_______表示。

  1. 继承
  2. 多态
  3. 抽象
  4. 递归
 

答案: a)

解释:继承表示 IS-A 关系。


2. Has-A 关系由 ______ 表示。

  1. 继承
  2. 多态
  3. 抽象
  4. 组合 (Composition)
 

答案: d)

解释:Has-A 关系由组合表示。


3. 父子关系也称为________。

  1. IS-A 关系
  2. Has-A 关系
  3. 多态
 

答案: a)

解释:父子关系也称为 IS-A 关系。


4. Final 类由 ________ 使用。

  1. 继承
  2. 组合 (Composition)
  3. 继承和组合都
 

答案: b)

解释:在组合中,我们可以重用来自 final 类的代码。


5. 代码重用由_______提供。

  1. 继承
  2. 组合 (Composition)
  3. 继承和组合都
 

答案:c)

解释:继承和组合都提供代码重用;两者之间的区别在于组合中我们不扩展类。


下一主题区别