在面向对象编程中,类与类之间的关系可以通过不同的方式来表示。以下是 继承(Inheritance)、实现(Realization)、关联(Association)、聚合(Aggregation)、组合(Composition) 和 依赖(Dependency) 的区别和特点:
1. 继承(Inheritance)
-
定义:继承是一种 "is-a" 关系,表示一个类(子类)继承另一个类(父类)的属性和方法。
-
特点:
-
子类拥有父类的所有非私有成员(属性和方法)。
-
子类可以重写父类的方法或添加新的方法。
-
继承是强耦合的关系,父类的变化会影响子类。
-
-
示例:
class Animal { void eat() { System.out.println("Animal is eating"); } } class Dog extends Animal { // Dog 继承 Animal void bark() { System.out.println("Dog is barking"); } }
2. 实现(Realization)
-
定义:实现是一种 "can-do" 关系,表示一个类实现一个接口(Interface),并实现接口中定义的所有方法。
-
特点:
-
接口定义了一组方法签名,类必须实现这些方法。
-
实现是松耦合的关系,接口的变化会影响实现类。
-
-
示例:
interface Flyable { void fly(); } class Bird implements Flyable { // Bird 实现 Flyable @Override public void fly() { System.out.println("Bird is flying"); } }
3. 关联(Association)
-
定义:关联是一种 "has-a" 关系,表示一个类与另一个类之间有某种联系。
-
特点:
-
关联可以是单向的或双向的。
-
关联关系通常是长期的,对象之间的生命周期没有强依赖。
-
-
示例:
class Teacher { private List<Student> students; // Teacher 和 Student 是关联关系 } class Student { private Teacher teacher; // Student 和 Teacher 是关联关系 }
4. 聚合(Aggregation)
-
定义:聚合是一种特殊的关联关系,表示 "whole-part" 关系,整体和部分可以独立存在。
-
特点:
-
部分对象可以属于多个整体对象。
-
整体和部分的生命周期是独立的,删除整体不会影响部分。
-
-
示例:
class Department { private List<Employee> employees; // Department 和 Employee 是聚合关系 } class Employee { // Employee 可以独立存在 }
5. 组合(Composition)
-
定义:组合是一种更强的 "whole-part" 关系,表示整体和部分的生命周期是紧密关联的。
-
特点:
-
部分对象不能独立于整体对象存在。
-
整体对象负责管理部分对象的生命周期。
-
-
示例:
class House { private Room room; // House 和 Room 是组合关系 public House() { room = new Room(); // Room 的生命周期由 House 管理 } } class Room { // Room 不能独立于 House 存在 }
6. 依赖(Dependency)
-
定义:依赖是一种 "use-a" 关系,表示一个类在某个方法中使用了另一个类。
-
特点:
-
依赖关系是临时的,通常体现在方法的参数或局部变量中。
-
依赖关系是弱耦合的,被依赖类的变化可能会影响依赖类。
-
-
示例:
class Car { void drive(Driver driver) { // Car 依赖 Driver driver.drive(); } } class Driver { void drive() { System.out.println("Driver is driving"); } }
总结对比
关系类型 | 定义 | 特点 | 示例 |
---|---|---|---|
继承 | "is-a" 关系 | 子类继承父类的属性和方法,强耦合 | Dog extends Animal |
实现 | "can-do" 关系 | 类实现接口的方法,松耦合 | Bird implements Flyable |
关联 | "has-a" 关系 | 类与类之间有联系,生命周期独立 | Teacher 和 Student |
聚合 | "whole-part" 关系 | 整体和部分可以独立存在,生命周期独立 | Department 和 Employee |
组合 | 强 "whole-part" 关系 | 整体和部分生命周期紧密关联,部分不能独立存在 | House 和 Room |
依赖 | "use-a" 关系 | 临时关系,通常体现在方法参数或局部变量中 | Car 依赖 Driver |
关键点
-
继承 和 实现 是类与类之间的垂直关系(父子关系)。
-
关联、聚合 和 组合 是类与类之间的水平关系(整体与部分)。
-
依赖 是临时的、弱耦合的关系,通常体现在方法级别。
通过理解这些关系的区别,可以更好地设计面向对象的系统。
在 UML(统一建模语言)中,箭头用于表示类与类之间的关系。不同的箭头类型和方向代表了不同的关系语义。以下是 UML 中常见箭头的解释:
关系类型 | 箭头类型 | 方向 | 语义 |
---|---|---|---|
继承 | 空心三角形箭头 + 实线 | 子类 → 父类 | 子类继承父类 |
实现 | 空心三角形箭头 + 虚线 | 实现类 → 接口 | 类实现接口 |
关联 | 普通箭头 + 实线 | 双向或单向 | 类与类之间有联系 |
聚合 | 空心菱形箭头 + 实线 | 部分 → 整体 | 整体和部分可以独立存在 |
组合 | 实心菱形箭头 + 实线 | 部分 → 整体 | 整体和部分生命周期紧密关联 |
依赖 | 普通箭头 + 虚线 | 依赖类 → 被依赖类 | 一个类在某个方法中使用另一个类 |
导航性 | 普通箭头 + 实线或虚线 | 单向或双向 | 表示关联关系的方向性 |
多重性 | 数字或范围标注 | 关联关系的两端 | 表示类与类之间的数量关系 |
通过理解这些箭头和关系的语义,可以更好地阅读和绘制 UML 图,从而更清晰地表达系统设计。