這篇文章主要介紹了Java依賴-關聯-聚合-組合之間區別理解,依賴關係比較好區分,它是耦合度最弱的一種,下文給大家介紹的非常詳細,感興趣的朋友一起看看吧
首先看一看書上對這四種關係的定義:
依賴(Dependency)關係是類別與類別之間的聯結。依賴關係表示一個類別依賴另一個類別的定義。例如,一個人(Person)可以買車(car)和房子(House),Person類別依賴Car類別和House類別的定義,因為Person類別引用了Car和House。與關聯不同的是,Person類別裡並沒有Car和House類型的屬性,Car和House的實例是以參量的方式傳入到buy()方法中去的。一般而言,依賴關係在Java語言中體現為局域變數、方法的形參,或是對靜態方法的呼叫。
關聯(Association)關係是類別與類別之間的聯接,它使一個類別知道另一個類別的屬性和方法。關聯可以是雙向的,也可以是單向的。在Java語言中,關聯關係一般使用成員變數來實作。
聚合(Aggregation) 關係是關聯關係的一種,是強的關聯關係。聚合是整體和個體之間的關係。例如,汽車類與引擎類、輪胎類,以及其它的零件類之間的關係便整體和個體的關係。與關聯關係一樣,聚合關係也是透過實例變數實現的。但是關聯關係所涉及的兩個類別是處在同一層次上的,而在聚合關係中,兩個類別是處在不平等層次上的,一個代表整體,另一個代表部分。
組合(Composition) 關係是關聯關係的一種,是比聚合關係強的關係。它要求普通的聚合關係中代表整體的物件負責代表部分物件的生命週期,組合關係是不能共享的。代表整體的對象需要負責維持部分對象和存活,在某些情況下將負責代表部分的對象湮滅掉。代表整體的對象可以將代表部分的對象傳遞給另一個對象,由後者負責此對象的生命週期。換言之,代表部分的物件在每一個時刻只能與一個物件發生組合關係,由後者排他地負責生命週期。部分和整體的生命週期一樣。
-摘自《Java物件導向程式設計》
以上關係的耦合依序增強(關於耦合度的概念將在以後具體討論,這裡可以暫時理解為當一個類別發生變更時,對其他類別造成的影響程度,影響越小則耦合度越弱,影響越大耦合度越強)。由定義我們已經知道,依賴關係其實是一種比較弱的關聯,聚合是一種比較強的關聯,而組合則是一種更強的關聯,所以籠統的來區分的話,實際上這四種關係、都是關聯關係。
依賴關係較好區分,它是耦合度最弱的一種,在java中表現為區域變數、方法的形參,或是對靜態方法的調用,如下面的例子:Driver類依賴Car類,Driver的三個方法分別演示了依賴關係的三種不同形式。
class Car { public static void run(){ System.out.println("汽车在奔跑"); } } class Driver { //使用形参方式发生依赖关系 public void drive1(Car car){ car.run(); } //使用局部变量发生依赖关系 public void drive2(){ Car car = new Car(); car.run(); } //使用静态变量发生依赖关系 public void drive3(){ Car.run(); } }
關聯關係在java中一般使用成員變數來實現,有時也以方法形參的形式實現。依然使用Driver和Car的例子,使用方法參數形式可以表示依賴關係,也可以表示關聯關係,畢竟我們無法在程式中太準確的表達語意。在這個例子中,使用成員變數表達這個意思:車是我自己的車,我「擁有」這個車。使用方法參數表達:車子不是我的,我只是個司機,別人給我什麼車我就開什麼車,我使用這個車。
class Driver { //使用成员变量形式实现关联 Car mycar; public void drive(){ mycar.run(); } ... //使用方法参数形式实现关联 public void drive(Car car){ car.run(); } }
聚合關係是一種較強的關聯關係,在java中一般使用成員變數形式實作。對象之間存在著整體與部分的關係。例如上例中
class Driver { //使用成员变量形式实现聚合关系 Car mycar; public void drive(){ mycar.run(); } }
假如給上面程式碼賦予以下語意:車是一輛私家車,是駕駛財產的一部份。則相同的程式碼即表示聚合關係了。聚合關係一般使用setter方法為成員變數賦值。
假如賦予以下語意:車是司機的必須有的財產,要成為一個司機必須先有輛車,車要是沒了,司機也不想活了。而且司機要是不幹司機了,這輛車就砸了,別人誰也別想用。那就表示組合關係了。一般來說,為了表示組合關係,常常會使用構造方法來達到初始化的目的,例如上例中,加上一個以Car為參數的建構方法
public Driver(Car car){ mycar = car; }
所以,关联、聚合、组合只能配合语义,结合上下文才能够判断出来,而只给出一段代码让我们判断是关联,聚合,还是组合关系,则是无法判断的。
以上是Java中依賴、關聯、聚合、組合四者之間的差異詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

javaispopularforcross-platformdesktopapplicationsduetoits“ writeonce,runany where”哲學。 1)itusesbytiesebyTecodeThatrunsonAnyJvm-備用Platform.2)librarieslikeslikeslikeswingingandjavafxhelpcreatenative-lookingenative-lookinguisis.3)

在Java中編寫平台特定代碼的原因包括訪問特定操作系統功能、與特定硬件交互和優化性能。 1)使用JNA或JNI訪問Windows註冊表;2)通過JNI與Linux特定硬件驅動程序交互;3)通過JNI使用Metal優化macOS上的遊戲性能。儘管如此,編寫平台特定代碼會影響代碼的可移植性、增加複雜性、可能帶來性能開銷和安全風險。

Java將通過雲原生應用、多平台部署和跨語言互操作進一步提昇平台獨立性。 1)雲原生應用將使用GraalVM和Quarkus提升啟動速度。 2)Java將擴展到嵌入式設備、移動設備和量子計算機。 3)通過GraalVM,Java將與Python、JavaScript等語言無縫集成,增強跨語言互操作性。

Java的強類型系統通過類型安全、統一的類型轉換和多態性確保了平台獨立性。 1)類型安全在編譯時進行類型檢查,避免運行時錯誤;2)統一的類型轉換規則在所有平台上一致;3)多態性和接口機制使代碼在不同平台上行為一致。

JNI會破壞Java的平台獨立性。 1)JNI需要特定平台的本地庫,2)本地代碼需在目標平台編譯和鏈接,3)不同版本的操作系統或JVM可能需要不同的本地庫版本,4)本地代碼可能引入安全漏洞或導致程序崩潰。

新興技術對Java的平台獨立性既有威脅也有增強。 1)雲計算和容器化技術如Docker增強了Java的平台獨立性,但需要優化以適應不同雲環境。 2)WebAssembly通過GraalVM編譯Java代碼,擴展了其平台獨立性,但需與其他語言競爭性能。

不同JVM實現都能提供平台獨立性,但表現略有不同。 1.OracleHotSpot和OpenJDKJVM在平台獨立性上表現相似,但OpenJDK可能需額外配置。 2.IBMJ9JVM在特定操作系統上表現優化。 3.GraalVM支持多語言,需額外配置。 4.AzulZingJVM需特定平台調整。

平台獨立性通過在多種操作系統上運行同一套代碼,降低開發成本和縮短開發時間。具體表現為:1.減少開發時間,只需維護一套代碼;2.降低維護成本,統一測試流程;3.快速迭代和團隊協作,簡化部署過程。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

記事本++7.3.1
好用且免費的程式碼編輯器

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器