CodeGym /Java 博客 /随机的 /类之间的关系。继承、组合和聚合
John Squirrels
第 41 级
San Francisco

类之间的关系。继承、组合和聚合

已在 随机的 群组中发布
你好!今天我们将仔细研究面向对象编程 (OOP) 的一项原则:继承。我们还将研究类之间其他类型的关系:组合和聚合。 类之间的关系。 继承、组合和聚合 - 1这个主题并不难:在过去的课程中,您已经多次遇到过继承和继承示例。今天,主要的事情是巩固你的知识,更详细地研究继承机制,并再次运行一些例子。:) 好吧,我们走吧!

Java中的继承及其优点

您肯定还记得,继承是一种让您可以基于现有类(父类)描述新类的机制。这样做时,新类借用了父类的属性和功能。让我们回忆一下前面课程中给出的继承示例:

public class Car {

   private String model;
   private int maxSpeed;
   private int yearOfManufacture;

   public Car(String model, int maxSpeed, int yearOfManufacture) {
       this.model = model;
       this.maxSpeed = maxSpeed;
       this.yearOfManufacture = yearOfManufacture;
   }


public void gas() {
       // Gas
   }

   	public void brake() {
       // Brake
   }
}


public class Truck extends Car {

   public Truck(String model, int maxSpeed, int yearOfManufacture) {
       super(model, maxSpeed, yearOfManufacture);
   }
}



public class Sedan extends Car {
   public Sedan(String model, int maxSpeed, int yearOfManufacture) {
       super(model, maxSpeed, yearOfManufacture);
   }
}
我们有一个涉及使用各种类型汽车的特定程序。即使您不是汽车爱好者,您也可能知道世界上有多种类型的汽车。:) 因此,我们将把汽车的共同属性分离到一个共同的父类中,称为Car. 那么所有汽车的共同点是什么,无论其类型如何?每辆车都有制造年份、型号名称和最高速度。我们将这些属性放入modelmaxSpeedyearOfManufacture字段中。至于行为,任何汽车都可以加速和减速。:) 我们在gas()brake()方法。这给我们带来了什么好处?首先,它减少了代码量。当然,我们可以不用父类。但由于每辆汽车都必须能够加速和减速,我们必须在、、和类以及所有其他汽车类中创建gas()和方法。想象一下我们需要编写多少额外的代码。并且不要忘记、和字段:如果我们去掉父类,我们将不得不在每个汽车类中创建它们! brake()TruckSedanF1CarSportsCarmodelmaxSpeedyearOfManufacture类之间的关系。 继承、组合和聚合 - 2当我们有几十个汽车类时,重复代码的数量就会变得非常严重。将公共字段和方法(也称为“状态”和“行为”)移动到父类可以让我们节省大量时间和空间。如果某些类型具有其他汽车类型所没有的独特属性或方法,那没什么大不了的。您始终可以在后代类中创建它们,与其他人分开。

public class F1Car extends Car {

   public void pitStop() {

       // Only race cars make pit stops
   }

   public static void main(String[] args) {

       F1Car formula1Car = new F1Car();
       formula1Car.gas();
       formula1Car.pitStop();
       formula1Car.brake();
   }
}
让我们以一级方程式赛车为例。与他们的“亲戚”不同,他们有一个独特的行为——他们不时进站。这不会打扰我们。我们已经描述了父类中的常见行为Car,子类的特定行为可以添加到这些类中。 类之间的关系。 继承、组合和聚合 - 3字段也是如此:如果一个子类有独特的属性,我们冷静地在子类内部声明这些字段,就不用担心了。:)重用代码的能力是继承的主要优势。 对于程序员来说,不写多余的代码是很重要的。你会在工作中反复遇到这个问题。请记住其他重要的事情:Java 没有多重继承. 每个类只继承一个类。我们将在以后的课程中详细讨论其原因。现在,只要记住它。顺便说一下,这使得 Java 不同于其他一些 OOP 语言。例如,C++ 支持多重继承。一切都或多或少地通过继承变得清晰。让我们继续。

组成和聚合

类和对象可以链接在一起。继承描述了一种“is-a”关系。狮子是一种动物。这样的关系很容易用继承来表达,其中Animal是父类,Lion是子类。然而,并不是所有的关系都是这样描述的。例如,键盘肯定与计算机有关,但它不是计算机。手在某种程度上与人有关,但它们不是人。在这些情况下,我们有另一种类型的关系:不是“is-a”,而是“has-a”。一只手不是一个人,而是一个人的一部分。键盘不是计算机,而是计算机的一部分。可以使用组合聚合在代码中描述 has-a 关系. 区别在于关系的“严格”。让我们举一个简单的例子:我们有一个Car类。每辆车都有发动机。此外,每辆车都有乘客。Engine engine和字段之间的根本区别是什么Passenger[] passengers?乘客A坐在车里并不意味着乘客B不在C车里。一辆汽车可以对应多名乘客。更重要的是,如果所有乘客都下车,它仍然可以顺利运行。Car类和数组之间的关系Passenger[] passengers不太严格。这叫做聚合。它提供了另一个聚合的好例子。假设我们有一个Student类和一个StudentGroup班级。一名学生可以加入多个学生组织:物理俱乐部、星球大战粉丝俱乐部和/或学生喜剧俱乐部。 组合是一种更严格的关系。使用组合时,对象是某个对象的一部分,不能属于同一类型的另一个对象。最简单的例子是汽车发动机。发动机是汽车的一部分,不能是另一辆汽车的一部分。如您所见,他们的关系比Car和之间的关系要严格得多Passengers类之间的关系。 继承、组合和聚合 - 4
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION