在開始本文的學習前,先總結一下已經學習過的內容。在前面9篇文章中,主 要是介紹Java類中的基本語法,是按照先概括,再具體的循序漸進的方式進行的 。先介紹了Java類的主要組成部分:數據成員,方法成員,構造方法。然後對一 些通用的知識點進行了較詳細介紹,如權限訪問修飾符,包,靜態修飾符,數據 類型等。了解了這些通用的知識點後,對於類的三個組成部分分別詳細介紹,如 介紹了類中各種數據的相關問題,介紹了構造方法的相關問題,介紹了方法會使 用到的操作符,流程控制,以及調用方法會使用到的值傳遞等知識點。在了解了 這些以後,初學者應該可以比較清楚的理解一個獨立的Java類,。但是,在Java 應用中,不可能只有一個Java類,而是會有很多Java類。這很多個Java類之間, 不可能是老死不相往來的,而會是彼此協作,完成復雜功能。所以,在了解了基 本知識點後,接下來,初學者應該著重學習Java語言中類與類的關系。
在本文中,將使用簡單的Java類,展示Java語言中類與類之間常見的兩種關 系:關聯關系,和依賴關系
1、關聯關系
類A關聯類B的意思是,如果實例化一個A類的對象,同時,會有一個B類的對 象被實例化。簡言之,B作為A的屬性存在。如下:
class A{ private B b; } class B{ }
2、依賴關系
類A依賴類B的意思是,如果A的對象要完成某一操作,必須使用B的對象的某 些操作來幫忙,才能完成。簡言之,B作為A的某個方法的方法參數存在。如下:
class A{ public void f(B b){ } } class B{ }
關聯和依賴,是面向對象編程中,最常見的兩種關系。假設有這樣一個場景 描述:某培訓中心提供免費培訓課程,每門課程都有其名字以及原價。學員最多 每人可以選擇一門課程,學員只要登記姓名,就可以選擇一門課程來學習。
通過分析這個簡單場景,可以很容易分析出,有兩種對象:學員,課程。也 就是說,我們應該創建兩個類,Student,Course。
Course類有兩個屬性,課程名稱和原始價格。如下:
package com.csst.relation; public class Course { private String title; private double price; public Course(String title, double price) { super(); this.title = title; this.price = price; } public Course(String title) { super(); this.title = title; } public Course() { super(); } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } }
然後創建另外一個類,Student,該類有一個學員姓名屬性name,另外,因為 每個學員可以選擇一門課程學習,那麼就是說,每個Student對象,會有一個 Course對象,即Course應該作為Student的一個屬性存在,即Student關聯了 Course。那麼,會有如下聲明:
package com.csst.relation; public class Student { private String name; //1.關聯關系:Student關聯Course private Course course; public Student(String name) { super(); this.name = name; } //TBD }
繼續分析,Student應該有1個行為,就是選擇課程。要完成選擇課程這個操 作,必須得接受一個課程的對象,也就是說,Student選課這個行為,必須依賴 於Course的一個對象,才能完成,所以Student和Course之間還存在依賴關系, 繼續完善上邊代碼:
package com.csst.relation; public class Student { private String name; //1.關聯關系:Student關聯Course private Course course; public Student(String name) { super(); this.name = name; } //2.依賴關系:Student依賴Course public void chooseCourse(Course course){ this.course=course; } public Course getCourse(){ return this.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語言中的一些“數據容器”對象:數組、集合。