從單類語法進階到多類協作,掌握關聯與依賴兩大核心類關係,是面向對象設計的關鍵一步。本文通過「培訓中心選課」場景,演示如何識別、建模並代碼實現這兩種關係,並引出集合容器的必要性。
定義:類 A 擁有類 B 的實例作為屬性,生命週期通常綁定。
class A { private B b; } // B 是 A 的字段
class B { }
場景:Student 擁有 Course(選課結果)。
public class Course {
private String title; private double price;
// 構造器、getter/setter
}
public class Student {
private String name;
private Course course; // 關聯:Student has-a Course
public Student(String name) { this.name = name; }
public void chooseCourse(Course c) { this.course = c; } // 同時也是依賴
public Course getCourse() { return course; }
}
定義:類 A 的方法需要類 B 的對象作為參數、返回值或局部變量協作,調用結束關係即結束。
class A { public void f(B b) { } } // B 是方法參數
class B { }
場景:Student.chooseCourse(Course) 需傳入 Course 參數完成選課動作。
| 維度 | 關聯 | 依賴 |
|---|---|---|
| UML 箭頭 | 實線箭頭 | 虛線箭頭 |
| 代碼體現 | 成員字段 | 方法參數/返回值/局部變量 |
| 生命週期 | 較長,隨擁有者 | 極短,隨方法調用 |
| 語義 | 「擁有」、「包含」 | 「使用」、「調用」 |
| 耦合強度 | 強 | 弱 |
初學者常覺 String、int 才是類型,自定義類不是。實則 每個類都是一種類型,Course 作為字段類型、參數類型、返回類型完全合法,與 String 無本質區別——只是前者在 JDK,後者在你的項目中。
若需求變更:每位學生最多選 3 門課,private Course course; 單字段不再足夠。引出數據容器:
Course[] courses = new Course[3]; 固定長度List<Course> courses = new ArrayList<>(); 動態擴容、豐富 API下一講將深入講解數組與集合框架,解決「一對多」關聯建模。