關聯關係和依賴關係
1、 關聯關係
類A關聯類B的意思是,如果例項化一個A類的物件,同時,會有一個B類的物件被例項化。簡言之,B作為A的屬性存在。如下:
- class A{
- private B b;
- }
- class B{
- }
2、 依賴關係
類A依賴類B的意思是,如果A的物件要完成某一操作,必須使用B的物件的某些操作來幫忙,才能完成。簡言之,B作為A的某個方法的方法引數存在。如下:
- class A{
- publicvoid f(B b){
- }
- }
- class B{
- }
關聯和依賴,是面向物件程式設計中,最常見的兩種關係。
3、示例
假設有這樣一個場景描述:某培訓中心提供免費培訓課程,每門課程都有其名字以及原價。學員最多每人可以選擇一門課程,學員只要登記姓名,就可以選擇一門課程來學習。
通過分析這個簡單場景,可以很容易分析出,有兩種物件:學員,課程。也就是說,我們應該建立兩個類,Student, Course。
Course類有兩個屬性,課程名稱和原始價格。如下:
- publicclass Course {
- private String title;
- privatedouble price;
-
public Course(String title,
- super();
- this.title = title;
- this.price = price;
- }
- public Course(String title) {
- super();
- this.title = title;
- }
- public Course() {
- super();
- }
-
public
- return title;
- }
- publicvoid setTitle(String title) {
- this.title = title;
- }
- publicdouble getPrice() {
- return price;
- }
- publicvoid setPrice(double price) {
- this.price = price;
- }
- }
然後建立另外一個類,Student,該類有一個學員姓名屬性name,另外,因為每個學員可以選擇一門課程學習,那麼就是說,每個Student物件,會有一個Course物件,即Course應該作為Student的一個屬性存在,即Student關聯了Course。那麼,會有如下宣告:
- publicclass Student {
- private String name;
- //1.關聯關係:Student關聯Course
- private Course course;
- public Student(String name) {
- super();
- this.name = name;
- }
- }
- publicclass Student {
- private String name;
- //1.關聯關係:Student關聯Course
- private Course course;
- public Student(String name) {
- super();
- this.name = name;
- }
- //2.依賴關係:Student依賴Course
- publicvoid chooseCourse(Course course){
- this.course=course;
- }
- public Course getCourse(){
- returnthis.course;
- }
- }
很多初學者,對於Course作為Student的一個屬性,以及Course型別作為方法引數,作為方法返回值的型別,不能接受。總覺得只有String,int之類才是資料型別,而Course作為一個型別存在,有些不倫不類。Java是面向物件的語言,任何一個類,就是一個型別,都可以作為資料型別存在,我們自己宣告的類也不例外。也就是說,如果能理解String作為一個型別存在,就應該坦然接受Course作為一個型別存在,因為它們是一樣的,都是一個型別而已,只不過String是API中宣告的,Course是我們自己宣告的。
學習本文內容後,初學者應該又上了一個臺階,就是不再僅僅關注某個Java類的語法,而是從更高的角度去看待Java應用,去關注類與類的關係。
總結一下關聯和依賴關係:
1、 關聯和依賴都是面向物件程式設計中,常用的關係。
2、 關聯表示has-a關係,如學生擁有一個課程,往往表現為B作為A的屬性存在(A關聯B)
3、 依賴表示要做一件事情,離不開某個物件。往往表現為B作為A的方法引數存在(A依賴B)
4、 當開始瞭解類與類的關係後,就需要對型別有更深入的瞭解。切記,任何類都可以作為型別使用。
在本文例子中,學生只能選擇一門免費課程學習,如果培訓中心加大優惠力度,每個學生最多可以選擇3門課程學習,應該如何維護這種關係哪?我們就不得不去了解Java語言中的一些“資料容器”物件:陣列、集合。