java中类与类的关系_Java中类与类的关系
在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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 笔记本恢复出厂设置的方法
- 下一篇: java 什么是servlet_Java