面向對象中類和類的關係

在面向對象方法中,我們在確定了類及類的屬性和方法後,不可避免的要研究類和類之間的關係,正是這些關係將整個事情串聯起來,使彼此之間有了聯繫,就像現實生活中,人與人交往中存在着不同的關係。瞭解這些關係,對於我們開發系統百利而無一害,可以讓我們輕鬆、高效的工作,同樣像我們在日常生活中處理好人與人之間的關係,會給我們帶來巨大的好處。那麼我們就來認識一下,面向對象中類與類之間有那些關係。

類和類之間的關係大概可以分爲一下幾種類型:泛化關係(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類而獨立存在

信息的封裝性不同

在聚合關係中,客戶端可以同時瞭解A類和B類,因爲他們都是獨立的

而在組合關係中,客戶端只認識A類,根本就不知道B類的存在,因爲B類被嚴密的封裝在A中。

③生命週期不同:

聚合是整體與部分之間是可分離的,他們可以具有各自的生命週期,不會因爲一方的消失另一方跟着消失。

聚合是整體與部分是不可分的,整體的生命週期結束也就意味着部分的生命週期結束。







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章