1. 程式人生 > >java類的幾種關係詳解(有程式碼、有類圖)

java類的幾種關係詳解(有程式碼、有類圖)

前言

知道類的幾種關係也是程式設計的基礎知識,通常我們在軟體設計、架構設計、開發中都需要使用的,

類的關係

一般情況下類的關係分為6種,分別是實現、繼承、依賴、關聯、聚合、組合,下面將這6中關係簡單的分類

(1)is a -->繼承、實現

(2)has a-->關聯、組合、聚合

(3)use a-->依賴

1、繼承(extends):繼承指的是一個類(稱為子類、子介面)繼承另外的一個類(稱為父類、父介面)的功能,並可以增加它自己的新功能的能力。在Java中繼承關係通過關鍵字extends明確標識,在設計時一般沒有爭議性。在UML類圖設計中,繼承用一條帶空心三角箭頭的實線表示,從子類指向父類,或者子介面指向父介面。 

例如,蛇是父類,眼鏡蛇繼承蛇,下面看uml圖和程式碼

 程式碼:

class Snake{
	void sleep(){}
}
class GlassSnake extends Snake{}

2、實現(implements):實現指的是一個class類實現interface介面(可以是多個)的功能,實現是類與介面之間最常見的關係。在Java中此類關係通過關鍵字implements明確標識,在設計時一般沒有爭議性。在UML類圖設計中,實現用一條帶空心三角箭頭的虛線表示,從類指向實現的介面。 

例如,UserService是介面、UserServiceImpl是介面的具體實現(javaweb開發中長使用)

程式碼:

interface UserService{
	void addUser();
}
class UserServiceImpl implements UserService{

	public void addUser() {
		// TODO Auto-generated method stub
		
	}
	
}

繼承和實現比較簡單,也沒什麼太大的爭議,比較容易區分,下面的幾種關係相對比較難區分,可能有爭議,先給他們的關係的強弱做個簡單的排序

依賴<關聯<聚合<組合

3,依賴:簡單的理解,依賴就是一個類A使用到了另一個類B,而這種使用關係是具有偶然性的、臨時性的、非常弱的,但是類B的變化會影響到類A。例如,人和電腦的關係,人沒必要一定要有電腦,但是比如人在寫程式碼的時候就需要用電腦,這是一種偶然性的,一般來說類B作為引數被類A在某個method方法中使用。在UML類圖設計中,依賴關係用由類A指向類B的帶箭頭虛線表示。

程式碼:

 class person{
	//寫程式碼
	void writeCode(Computer c){
		System.out.println("用電腦寫程式碼");
	}
}

class Computer{}

4、關聯:關聯體現的是兩個類之間語義級別的一種強依賴關係,比如人和鞋子,這種關係比依賴更強、不存在依賴關係的偶然性、關係也不是臨時性的,一般是長期性的,而且雙方的關係一般是平等的。關聯可以是單向、雙向的。表現在程式碼層面,為被關聯類B以類的屬性形式出現在關聯類A中,也可能是關聯類A引用了一個型別為被關聯類B的全域性變數。在UML類圖設計中,關聯關係用由關聯類A指向被關聯類B的帶箭頭實線表示,在關聯的兩端可以標註關聯雙方的角色和多重性標記。 通俗的解釋就是,我今天可以穿這個nike的鞋子,明天可能穿adidas的鞋子,後天還可能穿nb的鞋子

程式碼:

class Person{
	private Shoes mShoes;

	public Shoes getmShoes() {
		return mShoes;
	}

	public void setmShoes(Shoes mShoes) {
		this.mShoes = mShoes;
	}
	
}
class Shoes{}

5、聚合:聚合是關聯關係的一種特例,體現的是整體與部分的關係,即has-a的關係。此時整體與部分之間是可分離的,它們可以具有各自的生命週期,部分可以屬於多個整體物件,也可以為多個整體物件共享。比如汽車和發動機,汽車生產出來就有發動機,但是這個發動機可以是自己公司生產的、也可以拿別人公司的發動機組裝起來,聚合關係以空心菱形加實線箭頭表示。聚合中 整件不會擁有部件的生命週期,所以整件刪除時,部件不會被刪除。再者,多個整件可以共享同一個部件。通俗的解釋,就是大眾的汽車在生產的時候可以使用寶馬的發動機、賓士的汽車生產的時候也能用寶馬的發動機(當然寶馬願不願意是另外一回事,哈哈)

聚合側重的是在構造方法中傳入聚合的物件

程式碼:

class Engine{}
class Car{
	Engine mEngine;
	public Car(Engine engine) {
		// TODO Auto-generated constructor stub
		this.mEngine = engine;
	}
}

組合:最強的關係,又稱為強聚合、這種關係就類似於人和大腦、手腳等的關係,組合關係中,整件擁有部件的生命週期,所以整件刪除時,部件一定會跟著刪除。而且,多個整件不可以同時間共享同一個部件。通俗來講,就是一個人一出生她的心臟就已經明確的確定好了,並且當人老了去世了,她的心臟也就停止了(當然這個例子舉得優點差強人意...反正就大概這個意思)

組合側重,在建構函式中例項化組合的物件,通過new方法,或者間接通過new

程式碼:

class Person{
	private Brain mBrain;
	public Person() {
		// TODO Auto-generated constructor stub
		mBrain = new Brain();
	}
}
class Brain{}

好了,類的關係就簡單的講到這裡把,歡迎補充