Java 继承和组合的区别
在计算机编程中,可重用代码的概念指的是利用先前开发的软件来构建新软件。代码的可重用性被认为是有效功能的重要组成部分。建立类之间的关联是面向对象编程用来促进可重用性的一种方法。
在面向对象编程中,有两种主要的方法来构建这些关系:继承和组合。
在面向对象编程(OOP)中,继承是指一个对象可以具有一个或多个其他对象的属性的过程。在OOP中,继承是建立代码可重用性的最强大概念之一。使用继承时,可以通过与现有类建立父子连接来构建新类。这允许创建现有类的新子类型。
类继承的一种替代方法是称为“对象组合”的方法。组合是指在另一个对象中使用一个事物的过程。组合是一种新的关系形式,可能在类之间使用,这是面向对象编程所提供的。
由于通过利用以前建立的、精心设计的类作为组件,可以很容易地开发复杂的类,所以您会发现在许多情况下,您希望将一个对象作为另一个类的字段使用。这个过程的术语是“组合”。
尽管在许多情况下,继承和组合提供的功能大致相似,但对象组合被认为是一种比类继承更好的重用方法。阅读本文以了解更多关于继承和组合以及这两个概念如何不同的信息。
什么是组合
组合,也被称为“拥有关系”,是OOP提供的类之间的另一种关系类型。
当一个对象的属性必须包含在另一个对象中,以便关系有意义时,组合是必要的。为了创建一个由现有类组成的新类,必须将每个现有类的对象指定为新类的成员。
组合是将一个事物嵌套在另一个事物中的一种方式,可以很简单地解释。在许多情况下,您希望在另一个类中将一个已经定义的对象用作字段。在组合中,对象在一个类中被使用。
与类继承相比,对象组合是在运行时通过对象获取对其他类对象的引用的过程来动态定义的。组合是有益的,因为它提供了一种更好的方法来使用对象,而不会违反对象的内部信息。这是组合的另一个好处。
组合的示例
public class Student {
}
public class College {
private Student student;
public College() {
this.student = new Student();
}
}
什么是继承
当涉及到在面向对象编程中实现代码的重用性时,你可以使用继承这个最强大的工具之一。它是一种能够通过另一个对象来使一个对象获得一个或多个其他对象的属性的能力。
Java允许你构建从其他类继承属性的类。这意味着你可以通过特化一个类来建立类之间的“是一个关系”,从而最终实现基类和派生类之间的强耦合。
由于在继承实现时,新类是基于已经存在的类生成的,因此提高了代码的可重用性。类的继承使得对正在被重用的实现进行更改变得更加简单。然而,与类的继承也有一些缺点相关。继承是在编译时定义的,所以在运行时无法改变从父类继承的实现。
继承的性质可以是单级的、多级的、分层的、多层的或混合的。继承也可以采用混合继承的形式。
继承的示例
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
组合与继承的比较
下表突出了面向对象编程中组合和继承之间的主要区别:
对比基础 | 组成 | 继承 |
---|---|---|
关系 | 这是一种“有一个”的情况。 | 这是一种“是一个”的情况。 |
功能 | 我们可以在不必担心它们是父类还是子类的情况下评估我们使用的类的功能。 | 不能在没有先测试其父类的情况下测试子类。 |
不能在没有先测试其父类的情况下测试子类。 | 由于组合,即使在最终的类中,也可以重用代码。 | 继承不能用于扩展最终类的功能。 |
意义 | 简单地声明我们想要在组合中使用的类型,它可以存储多个实现,每个实现可以根据调用它们的上下文具有独特的行为。 | 在继承中,我们负责定义将成为我们“超类”的类,一旦使用了这个定义,它就是不可变的。 |
类的组合 | 组合使用户能够将多个类的特性和能力混合到一个单一实体中。 | Java不支持多重继承,这意味着不能扩展多个类。 |
结论
组合是一种隐式拥有的聚合关系,与明确声明的关系不同。考虑以下两个对象 – 一个与学校相关,另一个与教室相关。教室对象无法在学校对象之前存在。因此,这两个对象是相互依赖的。因此,我们可以将其称为一种组合关系。换句话说,如果一个东西不可能脱离整体而存在,那么它被称为一种组合关系。
组合关系通常被称为“拥有”关系,是面向对象编程提供的一种附加关系。由于两个事物之间的关联,如果一个事物的特征需要以某种方式融入另一个事物的特征,则需要组合关系。为了从现有的父类生成一个新类,必须将每个类的对象声明为当前类的成员。