三大特性
封裝
利用抽象資料型別將資料和基于資料的操作封裝在一起,使其構成一個不可分割的獨立物體,資料被保護在抽象資料型別的內部,盡可能地隱藏內部的細節,只保留一些對外介面使之與外部發生聯系,用戶無需知道物件內部的細節,但可以通過物件對外提供的介面來訪問該物件,
優點:
- 減少耦合: 可以獨立地開發、測驗、優化、使用、理解和修改
- 減輕維護的負擔: 可以更容易被程式員理解,并且在除錯的時候可以不影響其他模塊
- 有效地調節性能: 可以通過剖析確定哪些模塊影響了系統的性能
- 提高軟體的可重用性
- 降低了構建大型系統的風險: 即使整個系統不可用,但是這些獨立的模塊卻有可能是可用的
以下 Person 類封裝 name、gender、age 等屬性,外界只能通過 get() 方法獲取一個 Person 物件的 name 屬性和 gender 屬性,而無法獲取 age 屬性,但是 age 屬性可以供 work() 方法使用,
注意到 gender 屬性使用 int 資料型別進行存盤,封裝使得用戶注意不到這種實作細節,并且在需要修改 gender 屬性使用的資料型別時,也可以在不影響客戶端代碼的情況下進行
public class Person {
private String name;
private int gender;
private int age;
public String getName() {
return name;
}
public String getGender() {
return gender == 0 ? "man" : "woman";
}
public void work() {
if (18 <= age && age <= 50) {
System.out.println(name + " is working very hard!");
} else {
System.out.println(name + " can't work any more!");
}
}
}
繼承
繼承實作了 IS-A 關系,例如 Cat 和 Animal 就是一種 IS-A 關系,因此 Cat 可以繼承自 Animal,從而獲得 Animal 非 private 的屬性和方法,
繼承應該遵循里氏替換原則,子類物件必須能夠替換掉所有父類物件,
Cat 可以當做 Animal 來使用,也就是說可以使用 Animal 參考 Cat 物件,父類參考指向子類物件稱為 向上轉型 ,
Animal animal = new Cat();
多型
多型分為編譯時多型和運行時多型:
- 編譯時多型主要指方法的多載
- 運行時多型指程式中定義的物件參考所指向的具體型別在運行期間才確定
運行時多型有三個條件:
- 繼承
- 覆寫(重寫)
- 向上轉型
下面的代碼中,樂器類(Instrument)有兩個子類: Wind 和 Percussion,它們都覆寫了父類的 play() 方法,并且在 main() 方法中使用父類 Instrument 來參考 Wind 和 Percussion 物件,在 Instrument 參考呼叫 play() 方法時,會執行實際參考物件所在類的 play() 方法,而不是 Instrument 類的方法,
public class Instrument {
public void play() {
System.out.println("Instrument is playing...");
}
}
public class Wind extends Instrument {
public void play() {
System.out.println("Wind is playing...");
}
}
public class Percussion extends Instrument {
public void play() {
System.out.println("Percussion is playing...");
}
}
public class Music {
public static void main(String[] args) {
List<Instrument> instruments = new ArrayList<>();
instruments.add(new Wind());
instruments.add(new Percussion());
for(Instrument instrument : instruments) {
instrument.play();
}
}
}
類圖
下面的類圖使用PlatText繪制,
泛化關系 (Generalization)
用來描述繼承關系,在 Java 中使用 extends 關鍵字,
@startuml
title Generalization
class Vehical
class Car
class Truck
Vehical <|-- Car
Vehical <|-- Truck
@enduml
實作關系 (Realization)
用來實作一個介面,在 Java 中使用 implement 關鍵字,
@startuml
title Realization
interface MoveBehavior
class Fly
class Run
MoveBehavior <|.. Fly
MoveBehavior <|.. Run
@enduml
聚合關系 (Aggregation)
表示整體由部分組成,但是整體和部分不是強依賴的,整體不存在了部分還是會存在,
@startuml
title Aggregation
class Computer
class Keyboard
class Mouse
class Screen
Computer o-- Keyboard
Computer o-- Mouse
Computer o-- Screen
@enduml
組合關系 (Composition)
和聚合不同,組合中整體和部分是強依賴的,整體不存在了部分也不存在了,比如公司和部門,公司沒了部門就不存在了,但是公司和員工就屬于聚合關系了,因為公司沒了員工還在,
@startuml
title Composition
class Company
class DepartmentA
class DepartmentB
Company *-- DepartmentA
Company *-- DepartmentB
@enduml
關聯關系 (Association)
表示不同類物件之間有關聯,這是一種靜態關系,與運行程序的狀態無關,在最開始就可以確定,因此也可以用 1 對 1、多對 1、多對多這種關聯關系來表示,比如學生和學校就是一種關聯關系,一個學校可以有很多學生,但是一個學生只屬于一個學校,因此這是一種多對一的關系,在運行開始之前就可以確定,
@startuml
title Association
class School
class Student
School "1" - "n" Student
@enduml
依賴關系 (Dependency)
和關聯關系不同的是,依賴關系是在運行程序中起作用的,A 類和 B 類是依賴關系主要有三種形式:
- A 類是 B 類中的(某中方法的)區域變數;
- A 類是 B 類方法當中的一個引數;
- A 類向 B 類發送訊息,從而影響 B 類發生變化;
@startuml
title Dependency
class Vehicle {
move(MoveBehavior)
}
interface MoveBehavior {
move()
}
note "MoveBehavior.move()" as N
Vehicle ..> MoveBehavior
Vehicle .. N
@enduml
參考資料
- 面向物件設計的 SOLID 原則
- 看懂 UML 類圖和時序圖
- UML 系列——時序圖(順序圖)sequence diagram
- 面向物件編程三大特性 ------ 封裝、繼承、多型
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/518925.html
標籤:Java
上一篇:Redis—問題(1)
下一篇:JWT基礎概念詳解
