面向物件的程式設計概念對於程式設計非常重要。如果沒有對面向物件的程式設計概念有所了解,你將無法在面向物件的程式設計模型中設計系統。
什麼是面向物件的程式設計模型?
面向物件的程式設計模型圍繞著物件的概念。 什麼是物件? 物件是類別的一個實例。它包含屬性和函式。它們就像現實世界中的物件。例如,你的汽車、房子、筆記型電腦等都是物件。它們具有一些特定的屬性和方法來執行某些操作。 什麼是類別? 類別定義了物件的藍圖。它們定義了物件的屬性和功能。例如,筆記型電腦是一個類別,而你的筆記型電腦是它的一個實例。
面向物件的程式設計概念
核心面向物件的程式設計概念包括:
- 抽象化
- 封裝
- 多型
- 繼承
- 關聯
- 聚合
- 組合
讓我們逐一研究這些面向對象編程概念。我們將使用Java編程語言作為代碼示例,這樣你就知道如何在Java中實現面向對象編程的概念。
1. 抽象
抽象是隱藏內部細節並用簡單的術語描述事物的概念。例如,一個添加兩個整數的方法。該方法的內部處理對外部世界是隱藏的。在面向對象編程中,有許多實現抽象的方法,如封裝和繼承。Java程序也是抽象的一個很好的例子。在這裡,Java負責將簡單的語句轉換為機器語言,並將內部實現細節對外部世界隱藏起來。
進一步閱讀:面向對象編程中的抽象是什麼?
2. 封裝
封裝是物件導向程式設計中實現抽象的技術。封裝用於限制對類成員和方法的訪問。在物件導向程式設計中,使用存取修飾符關鍵字來實現封裝。例如,在Java中,可以使用private
、protected
和public
關鍵字來實現封裝。
3. 多型性
多型性是一個概念,即物件在不同情況下表現出不同的行為。有兩種多型性 – 編譯時多型性和運行時多型性。編譯時多型性是通過方法重載來實現的。例如,我們可以有一個如下的類。
public class Circle {
public void draw(){
System.out.println("Drwaing circle with default color Black and diameter 1 cm.");
}
public void draw(int diameter){
System.out.println("Drwaing circle with default color Black and diameter"+diameter+" cm.");
}
public void draw(int diameter, String color){
System.out.println("Drwaing circle with color"+color+" and diameter"+diameter+" cm.");
}
}
這裡有多個draw
方法,但它們具有不同的行為。這是一種方法重載的情況,因為所有方法的名稱相同,但參數不同。在編譯時,編譯器將能夠識別要調用的方法,因此這被稱為編譯時多態性。運行時多態性是在對象之間存在“IS-A”關係時實現的。這也被稱為方法重寫,因為子類必須重寫超類方法以實現運行時多態性。如果我們是根據超類進行工作,實際的實現類在運行時被決定。編譯器無法決定將調用哪個類的方法。這個決定是在運行時進行的,因此被稱為運行時多態性或動態方法調度。
package com.journaldev.test;
public interface Shape {
public void draw();
}
package com.journaldev.test;
public class Circle implements Shape{
@Override
public void draw(){
System.out.println("Drwaing circle");
}
}
package com.journaldev.test;
public class Square implements Shape {
@Override
public void draw() {
System.out.println("Drawing Square");
}
}
Shape
是超類,有兩個子類Circle
和Square
。下面是運行時多態性的示例。
Shape sh = new Circle();
sh.draw();
Shape sh1 = getShape(); //some third party logic to determine shape
sh1.draw();
在上面的例子中,Java編譯器不知道在運行時將使用Shape的實際實現類,因此是運行時多態性。
4. 繼承
繼承是物件導向編程的概念,其中一個物件是基於另一個物件的。繼承是代碼重用的機制。被繼承的物件稱為超級類別,而繼承超級類別的物件稱為子類別。我們在Java中使用extends
關鍵字來實現繼承。以下是Java中繼承的一個簡單示例。
package com.journaldev.java.examples1;
class SuperClassA {
public void foo(){
System.out.println("SuperClassA");
}
}
class SubClassB extends SuperClassA{
public void bar(){
System.out.println("SubClassB");
}
}
public class Test {
public static void main(String args[]){
SubClassB a = new SubClassB();
a.foo();
a.bar();
}
}
5. 關聯
關聯是物件導向編程的概念,用於定義物件之間的關係。關聯定義了物件之間的多重性。例如,教師和學生物件。教師和學生之間存在一對多的關係。同樣,學生可以與教師物件之間存在一對多的關係。然而,學生和教師物件都是彼此獨立的。
集成
聚合是一種特殊類型的關聯。在聚合中,物件具有自己的生命周期,但存在所有權關係。每當物件之間存在“具有”關係和所有權時,這就是聚合的情況。
6. 組合
組合是聚合的一種特殊情況。組合是聚合的一種更嚴格的形式。當“具有”關係中的包含對象無法單獨存在時,這就是一種組合情況。例如,房子具有房間。在這裡,房間不能沒有房子存在。組合被認為比繼承更好,詳細了解請參閱組合 vs 繼承。
進一步閱讀:Java 中的組合
這就是對面向對象編程概念的快速總結。
您可以從我們的GitHub 存儲庫查看更多 Java 示例程序。
Source:
https://www.digitalocean.com/community/tutorials/oops-concepts-java-example