面向對象中類和類的關系
在面向對象方法中,我們在確定了類及類的屬性和方法後。不可避免的要研究類和類之間的關系,正是這些關系將整個事情串聯起來。使彼此之間有了聯系,就像現實生活中,人與人交往中存在著不同的關系。
了解這些關系,對於我們開發系統百利而無一害,能夠讓我們輕松、高效的工作,相同像我們在日常生活中處理好人與人之間的關系。會給我們帶來巨大的優點。那麽我們就來認識一下。面向對象中類與類之間有那些關系。
類和類之間的關系大概能夠分為一下幾種類型:泛化關系(Generalization)、實現關系(realization)、依賴關系(Dependency)、關聯關系(Association)(關聯、聚合(Aggregation)、組合(Composition))。
泛化關系和實現關系體現的是一種類和類、或者類和接口間的關系。不存在引用,歸結為縱向關系。依賴關系和關聯關系體現的是類和類、類與接口間的引用。歸結為橫向關系。
一、泛化關系
泛化關系是一個類(子類、子接口)繼承另外的一個類(父類、父接口)的功能,而且能夠有自己的新功能。也既是我們所說的繼承關系。在java中通過extends來標識。在UML中用一條帶空心箭頭的實現表示,從子類指向父類,或者子接口指向父接口。
代碼例如以下: Class _A{} Class _B extends _A{} Public class Test{ Public static void main(String args[]){ _A a = new _B(); } }
二、實現關系
實現關系指的是class類實現interface接口(能夠使多個接口)。在java中用implements標識,在UML中用一條帶空心三角箭頭的虛線標識,從類指向實現的接口。
代碼例如以下: Interface A{} Class B implements A{} Public class Test{ Public static void main( String args[] ){ B b = new B(); } }
說明:以上泛化和實現為一對,兩者都用空心三角形。繼承關系比實現接口關系耦合性強, 所以繼承用實線,實現接口用虛線
三、依賴關系
依賴關系是類與類之間的連接. 表示一個類依賴於還有一個類的定義. 依賴關系總是單向的 。依賴是類的五種關系中耦合最小的一種關系。
由於依賴關系在生成代碼的時候,這兩個關系類都不會添加屬性。這樣的微弱的關系能夠用類之間的相互了解的程度來說明。在java 中. 依賴關系體現為: 局部變量, 方法中的參數, 和對靜態方法的調用.。
在UML中。依賴關系用由類A指向類B的帶箭頭虛線表示。
代碼例如以下所看到的:
Class A{ } Class B{ }
依賴關系表現形式一:
A類是B類的某個方法中的變量,則B類能夠調用它。代碼例如以下:
Class B{ Public void info(){ Private A a; } }
註:B有一個info方法,A類作為該方法的變量來使用。
A類的生命期。它是當B類的info方法被調用的時候,才被實例化。
依賴關系表現形式二:
A類是作為B類中某個方法的參數或者返回值時,代碼例如以下:
Class B { Public A info( A a){ Return null; } }
依賴關系表現形式三:
A類中有一個是靜態方法,B類能夠調用它
無用多說。A類被B類的一個方法持有。生命期隨著方法的運行結束而結束。
四、關聯關系
關聯體現的是兩個類之間語義級別的一種強依賴關系。這樣的關系比依賴更強、不存在依賴關系的偶然性、關系也不是暫時性的。通常是長期性的,它使一個類知道還有一個類的屬性和方法。並且兩方的關系通常是平等的。關聯能夠是單向、雙向的。在java 語言中關聯關系是使用實例變量實現的。
在UML中,關聯關系用由關聯類A指向被關聯類B的帶箭頭實線表示,在關聯的兩端能夠標註關聯兩方的角色和多重性標記。
單向關聯例如以下:
Class A { } Class B { Public A a; }
雙向關聯例如以下:
Class A { Public B b; } Class B { Public A a; }
說明:依賴和關聯的差別:
①從類的屬性是否添加的角度看:
發生依賴關系的兩個類都不會添加屬性。當中的一個類作為還有一個類的方法的參數或者返回值,或者是某個方法的變量而已。
發生關聯關系的兩個類,當中的一個類成為還有一個類的屬性,而屬性是一種更為緊密的耦合,更為長久的持有關系。
②從關系的生命期角度看:
依賴關系是僅當類的方法被調用時而產生。伴隨著方法的結束而結束了。
關聯關系是當類實例化的時候即產生。當類銷毀的時候。關系結束。
相比依賴講,關聯關系的生存期更長。
由於,關聯關系比依賴關系耦合性強,所以,關聯關系用實線。依賴關系用虛線。
關聯關系經過細化,還存在兩種特例:聚合和組合。
(1)聚合關系:是總體和個體之間的關系,即has-a的關系,此時總體與部分之間是可分離的。他們能夠具有各自的生命周期,部分能夠屬於多個總體對象,也能夠為多個總體對象共享;表如今代碼層面,和關聯關系是一致的,僅僅能從語義級別來區分。從java 語法上是分不出關聯和聚合的。
在UML中。聚合關系以空心菱形加實線箭頭表示。
代碼例如以下:
Class B { } Class A{ Public B b; A (B b){ This.b = b; } }
註意:關聯關系中兩個類是處於同樣的層次, 而聚合關系中兩不類是處於不平等的層次, 一個表示總體, 一個表示部分。
(2)組合關系: 體現的是一種contains-a的關系,這樣的關系比聚合更強。也稱為強聚合;他相同體現總體與部分間的關系,但此時總體與部分是不可分的,總體的生命周期結束也就意味著部分的生命周期結束;比方你和你的大腦;合成關系不能共享. 。
表如今代碼層面,和關聯關系是一致的,僅僅能從語義級別來區分。在UML中,組合關系以實心菱形加實線箭頭表示。
代碼例如以下:
Class B { } Class A{ Public B b; A (){ b = new Wings(); } }
註意:這兩種關系的差別在於
①構造函數不同
聚合類的構造函數中包括了還有一個類作為參數。A的構造函數中要用到B作為參數傳遞進來。
A能夠脫離雁群類而獨立存在。
組合類的構造函數中包括了還有一個類的實例化。
表明A在實例化之前,一定要先實例化B,這兩個類緊密的耦合在一起,同生共滅。
B類是不能夠脫離A類而獨立存在
②信息的封裝性不同
在聚合關系中,client能夠同一時候了解A類和B類,由於他們都是獨立的
而在組合關系中,client僅僅認識A類,根本就不知道B類的存在,由於B類被嚴密的封裝在A中。
③生命周期不同:
聚合是總體與部分之間是可分離的,他們能夠具有各自的生命周期。不會由於一方的消失還有一方跟著消失。
聚合是總體與部分是不可分的,總體的生命周期結束也就意味著部分的生命周期結束。
面向對象中類和類的關系