繼承,接口就不舉例了;
看看其他幾種:依賴,關聯,聚合,組合;
uml類圖中這幾種關係的耦合強弱比較:依賴<關聯<聚合<組合<繼承;
依賴關係:表示一個類依賴於另一個類的定義,依賴關係總是單向的。可以簡單的理解爲,一個類A使用到了另一個類B,但是B類的變化會影響到A;比如某人要過河,需要借用一條船,此時人與船之間的關係就是依賴;表現在代碼層面,就是類B作爲參數被類A在某個method方法中使用,或者在方法體重載聲明該類的變量,或者直接引用該類;
public class Boat
{
public void riverCrossing()
{
//啓動
//過河
}
public static void riverCrossingByShip()
{
//用大船過河
}
}
public class Person
{
public void goCrossRiver1(Boat boat)//方法參數形式
{
boat.riverCrossing();
}
public void goCrossRiver2()//方法體中聲明類對象的形式
{
Boat boat=new Boat();
boat.riverCrossing();
}
public void goCrossRiver3()
{
Boat.riverCrossingByShip();//靜態方法形式
}
}
對於依賴關係,再看一個例子:動物依賴於水
public class Animal
{
public Animal();
}
public class Water
{
public Water();
}
// animal類使用water類的表現形式
表現形式1:
Water類是全局的,則Animal類可以調用它;
表現形式2:
Water類是Animal類的某個方法中的變量,則Animal類可以調用它;
public class Animal
{
public void Grownup()
{
Water water=new Water();
//water類的生命週期,是當Animal類的Grownup()方法被調用的時候,才被實例化
//持有Water類的是Animal的一個方法而不是Animal類,這點是最重要的;
}
}
表現形式3:
public Animal
{
public Water Grownup(Water water)
{
//Water類被Animal類的一個方法持有,生命期隨着方法的執行結束而結束
}
}
關聯關係:
關聯關係表示類之間的關係比依賴強
舉個例子,水與氣候相關聯
public class Climate
{
public Climate()
{
}
}
public class Water
{
public Climate m_climate;
pubic Water()
{
}
}
可以看到生成的代碼中,Water類的屬性中增加了Climate類
關聯分爲單向關聯和雙向關聯,上述例子就是單向關聯,而下面這個例子則是雙向關聯
Public class Water {
public Climate m_Climate;
public Water(){}
}
Public class Climate {
public Water m_Water;
public Climate() {}
}
依賴關係和關聯關係的區別在哪裏?
1.從類的屬性是否增加的角度看:
1)發生依賴關係的兩個類都不會增加屬性,其中的一個類作爲另一個類的方法的參數或者返回值,或者是某個方法的變量而已;
2)發生關聯關係的兩個類,其中的一個類成爲另一個類的屬性,而屬性是一種更爲緊密的耦合,更爲長久的關係;
2.從關係的生命期的角度看:
1)依賴關係是僅當類的方法被調用時而產生,伴隨着方法的結束而結束了;
2)關聯關係是當類實例化的時候即產生,當類銷燬的時候,關係結束。相比依賴講,關聯關係的生存期更長;
關聯關係的細化:聚合,組合
看一個例子,大雁喜歡熱鬧害怕孤獨,所以它們一直過着羣居的生活,這樣就有了雁羣,每一隻大雁都有自己的雁羣,每個雁羣都有好多隻大雁,大雁與雁羣的這種關係就可以稱之爲聚合;
每隻大雁都有兩隻翅膀,大雁與翅膀的關係就叫做組合;
可見:
聚合的關係明顯沒有組合緊密,大雁不會因爲雁羣解散而無法生存;
而翅膀就無法脫離大雁而單獨生存:組合關係的類具有相同的生命週期;
public class Wings
{
}
public class Goose //組合
{
public Wings wings;
public Goose()
{
wings=new Wings();
}
}
public class GooseGroup //聚合
{
public Goose goose;
public GooseGroup(Goose goose)
{
this.goose=goose;
}
}
聚合和組合的不同之處:
1.構造函數不同:
聚合類的構造函數中包含了另一個類作爲參數。雁羣類(GooseGroup)的構造函數中要用到大雁(Goose)作爲參數傳遞進來,而大雁類(Goose)可以脫離雁羣而獨立存在;
組合類的構造函數中包含了另一個類的實例化。表明大雁類(Goose)在實例化之前,一定要先實例化翅膀類(Wings),這兩個類緊密的耦合在一起,同生共死;翅膀類(Wings)是不可以脫離大雁類(Goose)而獨立存在的;
2.信息封裝的不同
在聚合關係中,客戶端可以同時瞭解雁羣類和大雁類,因爲它們都是獨立的;
在組合關係中,客戶端只認識大雁類,根本就不知道翅膀類的存在,因爲翅膀類被嚴密的封裝在大雁類中;