1. 程式人生 > >面向對象中類和類的關系

面向對象中類和類的關系

避免 生命周期 interface 子類 pan 虛線 mar 空心三角 name

在面向對象方法中,我們在確定了類及類的屬性和方法後。不可避免的要研究類和類之間的關系,正是這些關系將整個事情串聯起來。使彼此之間有了聯系,就像現實生活中,人與人交往中存在著不同的關系。

了解這些關系,對於我們開發系統百利而無一害,能夠讓我們輕松、高效的工作,相同像我們在日常生活中處理好人與人之間的關系。會給我們帶來巨大的優點。那麽我們就來認識一下。面向對象中類與類之間有那些關系。

類和類之間的關系大概能夠分為一下幾種類型:泛化關系(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中。

③生命周期不同:

聚合是總體與部分之間是可分離的,他們能夠具有各自的生命周期。不會由於一方的消失還有一方跟著消失。

聚合是總體與部分是不可分的,總體的生命周期結束也就意味著部分的生命周期結束。







面向對象中類和類的關系