http://www.uml.org.cn/oobject/200812191.asp面試
類與類之間的關係對於理解面向對象具備很重要的做用,之前在面試的時候也常常被問到這個問題,在這裏我就介紹一下。 類與類之間存在如下關係: this
(1)泛化(Generalization) spa
(2)關聯(Association) 對象
(3)依賴(Dependency) 繼承
(4)聚合(Aggregation) 接口
UML圖與應用代碼例子: 生命週期
[泛化] 內存
表示類與類之間的繼承關係,接口與接口之間的繼承關係,或類對接口的實現關係。通常化的關係是從子類指向父類的,與繼承或實現的方法相反。 ci
[具體表現] get
父類 父類實例=new 子類()
[UML圖](圖1.1)
圖1.1 Animal類與Tiger類,Dog類的泛化關係
[代碼表現]
class Animal{}
class Tiger extends Animal{}
public class Test {
public void test() {
Animal a=new Tiger();
}
}
[依賴]
對於兩個相對獨立的對象,當一個對象負責構造另外一個對象的實例,或者依賴另外一個對象的服務時,這兩個對象之間主要體現爲依賴關係。
[具體表現]
依賴關係表如今局部變量,方法的參數,以及對靜態方法的調用
[現實例子]
好比說你要去擰螺絲,你是否是要藉助(也就是依賴)螺絲刀(Screwdriver)來幫助你完成擰螺絲(screw)的工做
[UML表現](圖1.2)
圖1.2Person類與Screwdriver類的依賴關係
[代碼表現]
public class Person{
/** 擰螺絲 */
public void screw(Screwdriver screwdriver){
screwdriver.screw();
}
}
[關聯]
對於兩個相對獨立的對象,當一個對象的實例與另外一個對象的一些特定實例存在固定的對應關係時,這兩個對象之間爲關聯關係。
[具體表現]
關聯關係是使用實例變量來實現
[現實例子]
好比客戶和訂單,每一個訂單對應特定的客戶,每一個客戶對應一些特定的訂單;再例如公司和員工,每一個公司對應一些特定的員工,每一個員工對應一特定的公司
[UML圖] (圖1.3)
圖1.3 公司和員工的關聯關係
[代碼表現]
public class Company{
private Employee employee;
public Employee getEmployee(){
return employee;
}
public void setEmployee(Employee employee){
this.employee=employee;
}
//公司運做
public void run(){
employee.startWorking();
}
}
[聚合]
當對象A被加入到對象B中,成爲對象B的組成部分時,對象B和對象A之間爲彙集關係。聚合是關聯關係的一種,是較強的關聯關係,強調的是總體與部分之間的關係。
[具體表現]
與關聯關係同樣,聚合關係也是經過實例變量來實現這樣關係的。關聯關係和聚合關係來語法上是沒辦法區分的,從語義上才能更好的區分二者的區別。
[關聯與聚合的區別]
(1)關聯關係所涉及的兩個對象是處在同一個層次上的。好比人和自行車就是一種關聯關係,而不是聚合關係,由於人不是由自行車組成的。 聚合關係涉及的兩個對象處於不平等的層次上,一個表明總體,一個表明部分。好比電腦和它的顯示器、鍵盤、主板以及內存就是彙集關係,由於主板是電腦的組成部分。
(2)對於具備彙集關係(尤爲是強彙集關係)的兩個對象,總體對象會制約它的組成對象的生命週期。部分類的對象不能單獨存在,它的生命週期依賴於總體類的對象的生命週期,當總體消失,部分也就隨之消失。好比張三的電腦被偷了,那麼電腦的全部組件也不存在了,除非張三事先把一些電腦的組件(好比硬盤和內存)拆了下來。
[UML圖](圖1.4)
圖1.4 電腦和組件的聚合關係
[代碼表現]
public class Computer{
private CPU cpu;
public CPU getCPU(){
return cpu;
}
public void setCPU(CPU cpu){
this.cpu=cpu;
}
//開啓電腦
public void start(){
//cpu運做
cpu.run();
}
}