日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

java中类与类的关系_Java中类与类的关系

發(fā)布時(shí)間:2023/12/15 java 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java中类与类的关系_Java中类与类的关系 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在java中類和類的關(guān)系大致分三種:泛化、關(guān)聯(lián)、依賴。

1. 泛化(Generalization)

"XX是一個(gè)XX"關(guān)系(is a),通常使用的關(guān)鍵詞為 extends、implements

繼承:繼承是面向?qū)ο笞铒@著的一個(gè)特性。繼承是從已有的類中派生出新的類,新的類能吸收已有類的數(shù)據(jù)屬性和行為,并能擴(kuò)展新的能力。

繼承的特點(diǎn):

1.繼承關(guān)系是傳遞的。若類C繼承類B,類B繼承類A(多層繼承),則類C既有從類B那里繼承下來的屬性與方法,也有從類A那里繼承下來的屬性與方法,還可以有自己新定義的屬性和方法。繼承來的屬性和方法盡管是隱式的,但仍是類C的屬性和方法。繼承是在一些比較一般的類的基礎(chǔ)上構(gòu)造、建立和擴(kuò)充新類的最有效的手段。

2.繼承簡(jiǎn)化了人們對(duì)事物的認(rèn)識(shí)和描述,能清晰體現(xiàn)相關(guān)類間的層次結(jié)構(gòu)關(guān)系。

3.繼承提供了軟件復(fù)用功能。若類B繼承類A,那么建立類B時(shí)只需要再描述與基類(類A)不同的少量特征(數(shù)據(jù)成員和成員方法)即可。這種做法能減小代碼和數(shù)據(jù)的冗余度,大大增加程序的重用性。

4.繼承通過增強(qiáng)一致性來減少模塊間的接口和界面,大大增加了程序的易維護(hù)性。

5.提供多重繼承機(jī)制。從理論上說,一個(gè)類可以是多個(gè)一般類的特殊類,它可以從多個(gè)一般類中繼承屬性與方法,這便是多重繼承。Java出于安全性和可靠性的考慮僅支持單重繼承,而通過使用接口機(jī)制來實(shí)現(xiàn)多重繼承。

注意:如果父類是接口那么其中所有的方法必須由子類重寫。如果父類是抽象類那么父類中的未實(shí)現(xiàn)方法必須有子類重寫,

一般父類

//父類

public class Car {

public void drive() {

System.out.println("車可以開");

}

}

//子類

public class Bus extends Car {

public void buyTickets(){

System.out.println("公交車要買票");

}

}

公交車拓展了車的功能增加了一個(gè)買票的功能

抽象父類

public abstract class Animal {

public void eat() {

System.out.println("動(dòng)物可以吃東西");

}

public abstract void move();

}

public class Dog extends Animal {

@Override

public void move() {

System.out.println("狗在地上跑");

}

}

有部分未實(shí)現(xiàn)的方法必須在子類中實(shí)現(xiàn)。

接口父類

public interface Phone {

void call();

void sendMsg();

}

public class SmartPhone implements Phone {

@Override

public void call() {

System.out.println("手機(jī)可以打電話");

}

@Override

public void sendMsg() {

System.out.println("手機(jī)可以發(fā)短信");

}

}

所有方法都在子類實(shí)現(xiàn)

2.關(guān)聯(lián)(Association)

"XX是XX的一部分"關(guān)系(has a)通常使用的關(guān)鍵字 new

當(dāng)一個(gè)對(duì)象中,加入了另外一個(gè)對(duì)象時(shí)就形成關(guān)聯(lián)關(guān)系。

關(guān)于分為有兩種特殊的形式,聚合(Aggregation)和組合(Composition),聚合和組合只有概念上的區(qū)別,在Java中的代碼實(shí)現(xiàn)上沒有區(qū)別。

在代碼中具體表現(xiàn)為成員變量。

1.組合

組合:表示類之間的整體和部分的關(guān)系,所有組合在一起的對(duì)象作為一個(gè)整體存在,當(dāng)整體不存在了那么部分對(duì)象也就不存在了

組合就像是人體,一旦人死亡每個(gè)器官就都死亡了。

2.聚合

聚合:表示整體和部分的關(guān)系,所有聚合在一起的對(duì)象作為一個(gè)整體存在,但個(gè)體的生命周期并不依賴整體的生命周期。

聚合就像人群,即使一個(gè)個(gè)體走散了個(gè)體也能生存。

下面我們就舉個(gè)例子來說明兩者關(guān)系:

有如下場(chǎng)景,汽車要開動(dòng)之前需要先清潔汽車,檢修完成后使用發(fā)動(dòng)機(jī)點(diǎn)火啟動(dòng)。

/**

* 汽車清理工具

*/

public class CleaningTools {

private static final CleaningTools cleaningTools = new CleaningTools();

private CleaningTools() {}

public static CleaningTools getCleaningTools() {

return cleaningTools;

}

public void clean() {

System.out.println("清潔汽車");

}

}

/**

* 汽車發(fā)動(dòng)機(jī)

*/

public class Motor {

public void startUp() {

System.out.println("發(fā)動(dòng)汽車");

}

}

public class Car {

private CleaningTools cleaningTools = CleaningTools.getCleaningTools();

private Motor motor = new Motor();

public void dirver() {

cleaningTools.clean();

motor.startUp();

}

public static void main(String[] args) {

Car car = new Car();

car.dirver();

}

}

在這個(gè)例子中汽車發(fā)動(dòng)機(jī)和汽車就是組合關(guān)系。當(dāng)汽車報(bào)廢后發(fā)動(dòng)機(jī)也會(huì)報(bào)廢。(強(qiáng)關(guān)聯(lián))

汽車和汽車清理工具的關(guān)系是,即便汽車報(bào)廢清理工具也能清理其他汽車。(弱關(guān)聯(lián))

3. 依賴(Dependency)

"XX用了一個(gè)XX"關(guān)系(use a)關(guān)鍵字 import

代碼中的表現(xiàn)為局部變量,方法的參數(shù),以及對(duì)靜態(tài)方法的調(diào)用

1.依賴

依賴: 指兩個(gè)相對(duì)獨(dú)立的類,一個(gè)類負(fù)責(zé)構(gòu)造另外一個(gè)類時(shí)兩個(gè)類就形成了依賴關(guān)系。

依賴關(guān)系是最普遍的關(guān)系

public class StringUtil {

public static boolean isNotEmpty(String str) {

return str != null && "".equals(str.trim());

}

}

public class Customer {

public static void main(String[] args) {

StringUtil.isNotEmpty("111");

}

}

我們調(diào)用了StringUtil中的isNotEmpty方法,那么我們就可以說Customer類依賴了StringUtil類

4.總結(jié)

應(yīng)該盡量?jī)?yōu)先使用關(guān)聯(lián),而不是泛化,因?yàn)榉夯瘯?huì)使得類關(guān)系過于復(fù)雜化,破壞了封裝性,使用組合一樣可以獲得已有類的功能,而且會(huì)使新類更加穩(wěn)固。

實(shí)際上,從依賴 ? 關(guān)聯(lián) ? 泛化,類與類之間的關(guān)系更加緊密,互相之間的影響越來越大。

1.泛化

優(yōu)點(diǎn)

子類能自動(dòng)繼承父類的接口

創(chuàng)建子類的對(duì)象時(shí),無須創(chuàng)建父類的對(duì)象

缺點(diǎn)

破壞封裝,子類與父類之間緊密耦合,子類依賴于父類的實(shí)現(xiàn),子類缺乏獨(dú)立性

支持?jǐn)U展,但是往往以增加系統(tǒng)結(jié)構(gòu)的復(fù)雜度為代價(jià)

不支持動(dòng)態(tài)繼承。在運(yùn)行時(shí),子類無法選擇不同的父類

子類不能改變父類的接口

2.關(guān)聯(lián)

優(yōu)點(diǎn)

不破壞封裝,整體類與局部類之間松耦合,彼此相對(duì)獨(dú)立

具有較好的可擴(kuò)展性

支持動(dòng)態(tài)組合。在運(yùn)行時(shí),整體對(duì)象可以選擇不同類型的局部對(duì)象

整體類可以對(duì)局部類進(jìn)行包裝,封裝局部類的接口,提供新的接口

缺點(diǎn)

整體類不能自動(dòng)獲得和局部類同樣的接口

創(chuàng)建整體類的對(duì)象時(shí),需要?jiǎng)?chuàng)建所有局部類的對(duì)象

3.使用泛化還是關(guān)聯(lián)。

新類是否需要向上造型。也就是說當(dāng)我們想重用原類型作為新類型的內(nèi)部實(shí)現(xiàn)的話,我們最好自己關(guān)聯(lián),如果我們不僅想重用內(nèi)部實(shí)現(xiàn)而且還想重用接口的話,那就用泛化。

4.依賴

依賴是一種極為松散的類組織結(jié)構(gòu)。

引用

總結(jié)

以上是生活随笔為你收集整理的java中类与类的关系_Java中类与类的关系的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。