面向对象编程中理解关联、聚合和组合





5.00/5 (1投票)
在面向对象编程 (OOP) 中,理解类之间的关系对于设计健壮且易于维护的系统至关重要。三种基本的关系类型是关联、聚合和组合。
1. 什么是关联?
关联表示一种类中的对象与另一种类中的对象相链接的关系。这种关系可以是点对点、一对多或多对多。关联是最通用的关系形式,并不意味着对象之间存在所有权或生命周期依赖关系。
1.1 点对点关联
在点对点关联中,一个类中的每个对象都与另一个类中的精确一个对象关联。例如,Person 类和 Passport 类,每个人都恰好有一个护照。

public class Person { private Passport passport; public Person(Passport passport) { this.passport = passport; } public Passport getPassport() { return passport; } } public class Passport { private String number; public Passport(String number) { this.number = number; } public String getNumber() { return number; } }
演示
public class Main { public static void main(String[] args) { Passport passport = new Passport("123456789"); Person person = new Person(passport); System.out.println("Passport Number: " + person.getPassport().getNumber()); } }
结果
Passport Number: 123456789
1.2 一对多关联
在一对多关联中,一个类中的对象与另一个类中的多个对象关联。例如,Teacher 类和 Student 类,一位老师可以有多个学生。

示例
import java.util.ArrayList; import java.util.List; public class Teacher { private List<Student> students = new ArrayList<>(); public void addStudent(Student student) { students.add(student); } public List<Student> getStudents() { return students; } } public class Student { private String name; public Student(String name) { this.name = name; } public String getName() { return name; } }
演示
public class Main { public static void main(String[] args) { Teacher teacher = new Teacher(); teacher.addStudent(new Student("John")); teacher.addStudent(new Student("Jane")); for (Student student : teacher.getStudents()) { System.out.println("Student Name: " + student.getName()); } } }
结果
Student Name: John Student Name: Jane
2. 什么是聚合?
聚合是关联的一种特殊形式,具有整体-部分关系,其中子对象可以独立于父对象存在。这表示比组合更弱的关系,意味着子对象的生命周期不依赖于父对象。
2.1 聚合示例
考虑 Library 和 Book 类。图书馆可以有多个图书,但图书可以独立于图书馆存在。
示例
import java.util.ArrayList; import java.util.List; public class Library { private List<Book> books = new ArrayList<>(); public void addBook(Book book) { books.add(book); } public List<Book> getBooks() { return books; } } public class Book { private String title; public Book(String title) { this.title = title; } public String getTitle() { return title; } }
演示
public class Main { public static void main(String[] args) { Library library = new Library(); library.addBook(new Book("The Catcher in the Rye")); library.addBook(new Book("To Kill a Mockingbird")); for (Book book : library.getBooks()) { System.out.println("Book Title: " + book.getTitle()); } } }
结果
Book Title: The Catcher in the Rye Book Title: To Kill a Mockingbird
3. 什么是组合?
组合是关联的一种形式,其中子对象的生命周期依赖于父对象的生命周期。如果父对象被销毁,子对象也会被销毁。这表示一种强大的关系和所有权。
3.1 组合示例
考虑 House 和 Room 类,其中房屋包含房间。房间不能独立于房屋存在。
示例
import java.util.ArrayList; import java.util.List; public class House { private List<Room> rooms = new ArrayList<>(); public House() { rooms.add(new Room("Living Room")); rooms.add(new Room("Bedroom")); } public List<Room> getRooms() { return rooms; } private class Room { private String name; public Room(String name) { this.name = name; } public String getName() { return name; } } }
演示
public class Main { public static void main(String[] args) { House house = new House(); for (House.Room room : house.getRooms()) { System.out.println("Room Name: " + room.getName()); } } }
结果
Room Name: Living Room Room Name: Bedroom
4. 结论
总而言之,理解关联、聚合和组合之间的区别对于设计有效的面向对象系统至关重要。每种关系类型都反映了不同程度的依赖性和所有权,帮助您准确地模拟现实世界场景。
如果您有任何问题或需要进一步澄清,请随时在下方评论!
更多文章请访问: 面向对象编程中理解关联、聚合和组合