java中类与类的关系_Java中类与类的关系
在java中類和類的關系大致分三種:泛化、關聯、依賴。
1. 泛化(Generalization)
"XX是一個XX"關系(is a),通常使用的關鍵詞為 extends、implements
繼承:繼承是面向對象最顯著的一個特性。繼承是從已有的類中派生出新的類,新的類能吸收已有類的數據屬性和行為,并能擴展新的能力。
繼承的特點:
1.繼承關系是傳遞的。若類C繼承類B,類B繼承類A(多層繼承),則類C既有從類B那里繼承下來的屬性與方法,也有從類A那里繼承下來的屬性與方法,還可以有自己新定義的屬性和方法。繼承來的屬性和方法盡管是隱式的,但仍是類C的屬性和方法。繼承是在一些比較一般的類的基礎上構造、建立和擴充新類的最有效的手段。
2.繼承簡化了人們對事物的認識和描述,能清晰體現相關類間的層次結構關系。
3.繼承提供了軟件復用功能。若類B繼承類A,那么建立類B時只需要再描述與基類(類A)不同的少量特征(數據成員和成員方法)即可。這種做法能減小代碼和數據的冗余度,大大增加程序的重用性。
4.繼承通過增強一致性來減少模塊間的接口和界面,大大增加了程序的易維護性。
5.提供多重繼承機制。從理論上說,一個類可以是多個一般類的特殊類,它可以從多個一般類中繼承屬性與方法,這便是多重繼承。Java出于安全性和可靠性的考慮僅支持單重繼承,而通過使用接口機制來實現多重繼承。
注意:如果父類是接口那么其中所有的方法必須由子類重寫。如果父類是抽象類那么父類中的未實現方法必須有子類重寫,
一般父類
//父類
public class Car {
public void drive() {
System.out.println("車可以開");
}
}
//子類
public class Bus extends Car {
public void buyTickets(){
System.out.println("公交車要買票");
}
}
公交車拓展了車的功能增加了一個買票的功能
抽象父類
public abstract class Animal {
public void eat() {
System.out.println("動物可以吃東西");
}
public abstract void move();
}
public class Dog extends Animal {
@Override
public void move() {
System.out.println("狗在地上跑");
}
}
有部分未實現的方法必須在子類中實現。
接口父類
public interface Phone {
void call();
void sendMsg();
}
public class SmartPhone implements Phone {
@Override
public void call() {
System.out.println("手機可以打電話");
}
@Override
public void sendMsg() {
System.out.println("手機可以發短信");
}
}
所有方法都在子類實現
2.關聯(Association)
"XX是XX的一部分"關系(has a)通常使用的關鍵字 new
當一個對象中,加入了另外一個對象時就形成關聯關系。
關于分為有兩種特殊的形式,聚合(Aggregation)和組合(Composition),聚合和組合只有概念上的區別,在Java中的代碼實現上沒有區別。
在代碼中具體表現為成員變量。
1.組合
組合:表示類之間的整體和部分的關系,所有組合在一起的對象作為一個整體存在,當整體不存在了那么部分對象也就不存在了
組合就像是人體,一旦人死亡每個器官就都死亡了。
2.聚合
聚合:表示整體和部分的關系,所有聚合在一起的對象作為一個整體存在,但個體的生命周期并不依賴整體的生命周期。
聚合就像人群,即使一個個體走散了個體也能生存。
下面我們就舉個例子來說明兩者關系:
有如下場景,汽車要開動之前需要先清潔汽車,檢修完成后使用發動機點火啟動。
/**
* 汽車清理工具
*/
public class CleaningTools {
private static final CleaningTools cleaningTools = new CleaningTools();
private CleaningTools() {}
public static CleaningTools getCleaningTools() {
return cleaningTools;
}
public void clean() {
System.out.println("清潔汽車");
}
}
/**
* 汽車發動機
*/
public class Motor {
public void startUp() {
System.out.println("發動汽車");
}
}
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();
}
}
在這個例子中汽車發動機和汽車就是組合關系。當汽車報廢后發動機也會報廢。(強關聯)
汽車和汽車清理工具的關系是,即便汽車報廢清理工具也能清理其他汽車。(弱關聯)
3. 依賴(Dependency)
"XX用了一個XX"關系(use a)關鍵字 import
代碼中的表現為局部變量,方法的參數,以及對靜態方法的調用
1.依賴
依賴: 指兩個相對獨立的類,一個類負責構造另外一個類時兩個類就形成了依賴關系。
依賴關系是最普遍的關系
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");
}
}
我們調用了StringUtil中的isNotEmpty方法,那么我們就可以說Customer類依賴了StringUtil類
4.總結
應該盡量優先使用關聯,而不是泛化,因為泛化會使得類關系過于復雜化,破壞了封裝性,使用組合一樣可以獲得已有類的功能,而且會使新類更加穩固。
實際上,從依賴 ? 關聯 ? 泛化,類與類之間的關系更加緊密,互相之間的影響越來越大。
1.泛化
優點
子類能自動繼承父類的接口
創建子類的對象時,無須創建父類的對象
缺點
破壞封裝,子類與父類之間緊密耦合,子類依賴于父類的實現,子類缺乏獨立性
支持擴展,但是往往以增加系統結構的復雜度為代價
不支持動態繼承。在運行時,子類無法選擇不同的父類
子類不能改變父類的接口
2.關聯
優點
不破壞封裝,整體類與局部類之間松耦合,彼此相對獨立
具有較好的可擴展性
支持動態組合。在運行時,整體對象可以選擇不同類型的局部對象
整體類可以對局部類進行包裝,封裝局部類的接口,提供新的接口
缺點
整體類不能自動獲得和局部類同樣的接口
創建整體類的對象時,需要創建所有局部類的對象
3.使用泛化還是關聯。
新類是否需要向上造型。也就是說當我們想重用原類型作為新類型的內部實現的話,我們最好自己關聯,如果我們不僅想重用內部實現而且還想重用接口的話,那就用泛化。
4.依賴
依賴是一種極為松散的類組織結構。
引用
總結
以上是生活随笔為你收集整理的java中类与类的关系_Java中类与类的关系的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 笔记本恢复出厂设置的方法
- 下一篇: java美元兑换,(Java实现) 美元