Java 基础 - 面向对象(不错N多教程集合)
著作權歸https://pdai.tech所有。 鏈接:Java 基礎 - 面向對象 | Java 全棧知識體系
本文主要介紹Java OOP 面向對象基礎和相關類圖。@pdai
- Java 基礎 - 面向對象
- 三大特性
- 封裝
- 繼承
- 多態
- 類圖
- 泛化關系 (Generalization)
- 實現關系 (Realization)
- 聚合關系 (Aggregation)
- 組合關系 (Composition)
- 關聯關系 (Association)
- 依賴關系 (Dependency)
- 參考資料
- 三大特性
? 三大特性
? 封裝
利用抽象數據類型將數據和基于數據的操作封裝在一起,使其構成一個不可分割的獨立實體。數據被保護在抽象數據類型的內部,盡可能地隱藏內部的細節,只保留一些對外接口使之與外部發生聯系。用戶無需知道對象內部的細節,但可以通過對象對外提供的接口來訪問該對象。
優點:
- 減少耦合: 可以獨立地開發、測試、優化、使用、理解和修改
- 減輕維護的負擔: 可以更容易被程序員理解,并且在調試的時候可以不影響其他模塊
- 有效地調節性能: 可以通過剖析確定哪些模塊影響了系統的性能
- 提高軟件的可重用性
- 降低了構建大型系統的風險: 即使整個系統不可用,但是這些獨立的模塊卻有可能是可用的
以下 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!");}} }@pdai: 代碼已經復制到剪貼板
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
? 繼承
繼承實現了 IS-A 關系,例如 Cat 和 Animal 就是一種 IS-A 關系,因此 Cat 可以繼承自 Animal,從而獲得 Animal 非 private 的屬性和方法。
繼承應該遵循里氏替換原則,子類對象必須能夠替換掉所有父類對象。
Cat 可以當做 Animal 來使用,也就是說可以使用 Animal 引用 Cat 對象。父類引用指向子類對象稱為 向上轉型 。
Animal animal = new Cat();@pdai: 代碼已經復制到剪貼板
1
? 多態
多態分為編譯時多態和運行時多態:
- 編譯時多態主要指方法的重載
- 運行時多態指程序中定義的對象引用所指向的具體類型在運行期間才確定
運行時多態有三個條件:
- 繼承
- 覆蓋(重寫)
- 向上轉型
下面的代碼中,樂器類(Instrument)有兩個子類: Wind 和 Percussion,它們都覆蓋了父類的 play() 方法,并且在 main() 方法中使用父類 Instrument 來引用 Wind 和 Percussion 對象。在 Instrument 引用調用 play() 方法時,會執行實際引用對象所在類的 play() 方法,而不是 Instrument 類的方法。
public class Instrument {public void play() {System.out.println("Instument 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();}} }@pdai: 代碼已經復制到剪貼板
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
? 類圖
以下類圖使用 PlantUML (opens new window) 繪制,更多語法及使用請參考: http://plantuml.com/ 。
? 泛化關系 (Generalization)
用來描述繼承關系,在 Java 中使用 extends 關鍵字。
@startumltitle Generalizationclass Vehical class Car class TruckVehical <|-- Car Vehical <|-- Truck@enduml@pdai: 代碼已經復制到剪貼板
1
2
3
4
5
6
7
8
9
10
11
12
? 實現關系 (Realization)
用來實現一個接口,在 Java 中使用 implement 關鍵字。
@startumltitle Realizationinterface MoveBehavior class Fly class RunMoveBehavior <|.. Fly MoveBehavior <|.. Run@enduml@pdai: 代碼已經復制到剪貼板
1
2
3
4
5
6
7
8
9
10
11
12
? 聚合關系 (Aggregation)
表示整體由部分組成,但是整體和部分不是強依賴的,整體不存在了部分還是會存在。
@startumltitle Aggregationclass Computer class Keyboard class Mouse class ScreenComputer o-- Keyboard Computer o-- Mouse Computer o-- Screen@enduml@pdai: 代碼已經復制到剪貼板
1
2
3
4
5
6
7
8
9
10
11
12
13
14
? 組合關系 (Composition)
和聚合不同,組合中整體和部分是強依賴的,整體不存在了部分也不存在了。比如公司和部門,公司沒了部門就不存在了。但是公司和員工就屬于聚合關系了,因為公司沒了員工還在。
@startumltitle Compositionclass Company class DepartmentA class DepartmentBCompany *-- DepartmentA Company *-- DepartmentB@enduml@pdai: 代碼已經復制到剪貼板
1
2
3
4
5
6
7
8
9
10
11
12
? 關聯關系 (Association)
表示不同類對象之間有關聯,這是一種靜態關系,與運行過程的狀態無關,在最開始就可以確定。因此也可以用 1 對 1、多對 1、多對多這種關聯關系來表示。比如學生和學校就是一種關聯關系,一個學校可以有很多學生,但是一個學生只屬于一個學校,因此這是一種多對一的關系,在運行開始之前就可以確定。
@startumltitle Associationclass School class StudentSchool "1" - "n" Student@enduml@pdai: 代碼已經復制到剪貼板
1
2
3
4
5
6
7
8
9
10
? 依賴關系 (Dependency)
和關聯關系不同的是,依賴關系是在運行過程中起作用的。A 類和 B 類是依賴關系主要有三種形式:
- A 類是 B 類中的(某中方法的)局部變量;
- A 類是 B 類方法當中的一個參數;
- A 類向 B 類發送消息,從而影響 B 類發生變化;
@pdai: 代碼已經復制到剪貼板
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
? 參考資料
-
Java 編程思想
-
敏捷軟件開發: 原則、模式與實踐
-
面向對象設計的 SOLID 原則 (opens new window)
-
看懂 UML 類圖和時序圖 (opens new window)
-
UML 系列——時序圖(順序圖)sequence diagram (opens new window)
-
面向對象編程三大特性 ------ 封裝、繼承、多態 (opens new window)
-
javaoop基礎知識總結 https://blog.csdn.net/weixin_38173324/article/details/70037927
-
Java實現OOP(面向對象編程) https://www.cnblogs.com/AlanLee/p/6475334.html
-
Java 抽象類與oop三大特征 http://www.cnblogs.com/wujing-hubei/p/6012105.html
來源:Java 基礎 - 面向對象 | Java 全棧知識體系
總結
以上是生活随笔為你收集整理的Java 基础 - 面向对象(不错N多教程集合)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java 基础 - 面向对象(不错)
- 下一篇: 为什么说打工人不要去老乡鸡点3个肉菜