面向初學者的 OOP 概念:多態性解釋
已發表: 2021-12-10在 Python 和 Java 等高級語言中,OOP 或面向對象編程是指圍繞數據和對象而不是邏輯和功能的軟件設計組織。 對像被定義為具有獨特屬性和行為的數據字段。 換句話說,OOP 專注於對象而不是邏輯。 這種編程模型非常適合需要主動更新和維護的大型複雜程序。 此外,它還帶來了可擴展性、效率和代碼可重用性的額外好處。
OOP 有四個基本構建塊——多態、封裝、抽象和繼承。 由於本文的範圍僅限於 OOP 中的多態性,因此我們將詳細討論多態性,包括 Java 中的多態性和 Python 中的多態性示例。
從世界頂級大學在線學習軟件課程。 獲得行政 PG 課程、高級證書課程或碩士課程,以加快您的職業生涯。
目錄
多態性定義
最簡單的多態性定義是多態性意味著以各種形式存在。 它起源於兩個希臘術語——“poly”,意思是“眾多”和“morph”,意思是“形式”。
為了更好地理解這個概念,我們先舉一個簡單的例子。 以光標行為為例,每次使用鼠標或觸控板時,您在屏幕上看到的光標都在移動。 根據用戶的動作或程序模式,光標可以採用不同的形式,例如箭頭、十字、線或食指。
多態性是 OOP 最重要的特徵之一。 在 Java 和 Python 中,變量、對象和函數可以以多種形式存在。 在多態性中,子類或方法定義其屬性和行為,同時保留其父類的一些功能。 這將我們帶到了繼承,它允許您創建類層次結構,其中基類將其屬性和行為提供給派生類。 隨後,派生類的功能可以根據需要自由修改或擴展。 為此,多態性確保根據調用對象的類型執行正確的方法。
為了正確看待它,假設您有一個顯示日期和時間的類。 現在,您創建一個繼承類並顯示消息“Hello!”的方法。 連同日期和時間。
Java中的多態性示例
考慮具有方法“area()”的超類“Shapes”。 “形狀”下的子類可以是“矩形”、“圓形”、“三角形”等,每個子類都有其計算面積的方法。 應用繼承和多態的概念,子類使用“area()”方法來找到計算相應形狀面積的公式。
類形狀{
公共無效區域(){
System.out.println(“面積公式”);
}
}
類三角形擴展形狀{
公共無效區域(){
System.out.println(“三角形是 1/2 * 底 * 高”);
}
}
類圓形擴展形狀{
公共無效區域(){
System.out.println(“圓為 3.14 * 半徑 * 半徑”);
}
}
類主{
公共靜態無效主要(字符串[]參數){
形狀 myShape = new Shapes(); // 創建一個 Shapes 對象
形狀 myTriangle = new Triangle(); // 創建一個三角形對象
形狀 myCircle = new Circle(); // 創建一個圓形對象
myShape.area();
myTriangle.area();
myShape.area();
myCircle.area();
}
}
上述程序代碼的輸出將如下:
三角形的面積公式是 1/2 * 底 * 高
圓的面積公式是 3.14 * 半徑 * 半徑
OOP 中的多態性類型
OOP 中的多態性有兩種類型——靜態(編譯時多態性)和動態(運行時多態性)。
1. 靜態多態
在 Java 中,方法重載是最常見的靜態多態類型。 它可以在同一個類中創建多個同名但參數不同的方法。 參數集必須至少在以下三個標準之一方面有所不同:
- 這些方法需要具有不同數量的參數。
- 參數類型需要不同。 例如,如果一種方法接受 Long,則另一種方法接受 String。
- 這些方法應該接受不同順序的參數。 例如,如果方法 1 接受 Long 和 String,則方法 2 必須接受 String 和 Long。
在方法重載中,在調用方法時,編譯器根據調用時傳遞的參數來選擇調用哪個方法。 這發生在編譯時,因此,這種類型的多態性也稱為編譯時多態性。
以下是顯示編譯時多態性的 Java 代碼示例。 在這個例子中,adds() 方法被重載了兩種不同類型的參數。
包靜態多態;
公共課加法
{
無效總和(int x,int y)
{
詮釋 c = x+y;
System.out.println(“兩個數相加:” +c); }
無效總和(int x,int y,int z)
{
詮釋 c = x+y+z;
System.out.println(“三個數相加:” +c); }
公共靜態無效主要(字符串 [] 參數)
{
加法 obj = new Addition();
obj.sum (45,34);
obj.sum(60, 32, 11);
}
}
上述程序的輸出將是:
兩個數字相加:79
三個數字相加:103
2.動態多態性
動態或運行時多態性是通過方法覆蓋來實現的。 在這裡,方法在不同的類中有不同的形式(方法覆蓋),而不是編譯時,對覆蓋方法的調用在運行時解決。 現在,在將對象分配給類引用並調用方法後,對像類中的方法就會被執行。 由於對像是在運行時創建的,因此應該執行的方法(在對像中)的形式僅在運行時決定。
以下是顯示運行時多態性的 Java 代碼示例。 在示例中,有一個超類“Animal”和三個子類“kangaroo”、“tiger”和“fish”。 子類擴展了超類並覆蓋了它的“move()”方法。 “move()”方法由父類“Animal”的引用變量調用。
動物類{
無效移動(){
System.out.println(“動物移動”);
}
}
類袋鼠擴展動物{
無效移動(){
System.out.println(“袋鼠跳”);
}
}
類老虎擴展動物{
無效移動(){
System.out.println(“老虎走路”);
}
}
類魚擴展動物{
無效移動(){
System.out.println(“魚游”);
}
}
類主{
公共靜態無效主要(字符串參數[]){
動物 A = 新動物();
動物 k = 新袋鼠(); //向上轉型
動物 t = 新老虎(); //向上轉型
動物 f = 新魚(); //向上轉型
一個動作();
k.move();
t.move();
f.move();
}
}
上述程序的輸出將是:
動物移動
袋鼠跳
老虎走
魚游
Python中的多態性
Python中的多態性分為三種類型——運算符多態性、函數多態性和類多態性。 Python 還允許方法覆蓋,但不允許方法重載。
1. 算子多態性
在 Python 中,“+”運算符具有雙重用途。 它用於整數數據類型的算術加法運算,對於字符串,“+”運算符執行連接。
以下是一個 Python 代碼示例,其中“+”運算符對整數數據類型執行加法:
數字1 = 4
數字2 = 5
打印(num1+num2)
上述程序代碼的輸出是“9”。
以下是一個 Python 代碼示例,其中“+”運算符對字符串數據類型執行連接:
str1 = “好”
str2 = “晚上”
打印(str1+” “+str2)
上述程序的輸出將是“晚安”。
2.函數多態
Python 中的 'len()' 函數兼容不同的數據類型,如列表、字符串、元組、字典和集合,但返回每種數據類型的特定信息。 這是一個例子:
打印(len(“程序員”))
print(len([“Python”, “Java”, “C”]))
打印(len({“姓名”:“凱西”,“地址”:“德克薩斯”}))
上面的程序將有以下輸出:
9
3
2
3. 類多態
擴展多態性的概念,Python 允許多個類擁有同名的方法。 下面給出了一個顯示 Python 中類方法中的多態性的示例。 在示例中,有兩個類,“Cat”和“Dog”。 它們具有相似的結構並具有相同的方法名稱“make_sound()”和“info()”。
貓類:
def __init__(自我,姓名,年齡):
self.name = 名稱
自我年齡 = 年齡
定義信息(自我):
print(f“我是一隻貓。我的名字是 {self.name}。我是 {self.age} 歲。”)
def make_sound(self):
打印(“喵”)
類狗:
def __init__(自我,姓名,年齡):
self.name = 名稱
自我年齡 = 年齡
定義信息(自我):
print(f“我是一隻狗。我的名字是 {self.name}。我是 {self.age} 歲。”)
def make_sound(self):
打印(“樹皮”)
cat1 = 貓(“米妮”,3)
dog1 = 狗(“湯姆”,6)
對於 (cat1, dog1) 中的動物:
動物.make_sound()
動物信息()
動物.make_sound()
輸出如下:
喵
我是一隻貓。 我的名字是米妮。 我今年 3 歲。
喵
吠
我是一隻狗。 我的名字是湯姆。 我今年 6 歲。
吠
4. 方法覆蓋
Python 還允許子類從父類繼承屬性和方法。 可以重新定義某些方法和屬性以適應子類(方法覆蓋)。 然後,多態允許訪問與父類同名的重寫方法和屬性。
以下是說明方法覆蓋的 Python 代碼示例:
從數學導入 pi
類形狀:
def __init__(self, name):
self.name = 名稱
定義區域(自身):
經過
事實(自我):
返回“我是一個封閉的人物。”
def __str__(self):
返回 self.name
類方形(形狀):
def __init__(自我,長度):
super().__init__(“正方形”)
self.length = 長度
定義區域(自身):
返回 self.length**2
事實(自我):
return “正方形的每個角都等於 90 度。”
類圓(形狀):
def __init__(自我,半徑):
super().__init__(“圓”)
self.radius = 半徑
定義區域(自身):
返回 pi*self.radius**2
a = 正方形(4)
b = 圓(7)
打印(b)
打印(b.fact())
打印(a.fact())
打印(b.area())
上面的程序將有以下輸出:
圓圈
我是一個封閉的人物。
正方形中的每個角等於 90 度。
153.93804002589985
了解有關方法覆蓋的更多信息。
OOP 中多態性的優勢
OOP 中的多態性具有三個顯著優勢。 它們如下:
- 多態性允許代碼的可重用性。 因此,一旦編寫、測試和實現了類,您就可以一次又一次地重用它們。 另外,可以更改代碼而不影響原始代碼。 所有這些都為編碼人員節省了大量時間。
- 在多態性中,多個數據值可以存儲在單個變量中。 此外,可以修改從超類繼承到子類的變量值,而無需更改超類或任何子類中的變量值。
- 最後,多態性使用更少的代碼行,這反過來又使程序員更容易調試。
前進之路
upGrad 與著名的利物浦約翰摩爾斯大學合作,提供嚴格的在線數據科學理學碩士課程 適用於有志於從事數據科學事業的在職專業人士。 該課程以 LJMU 的碩士學位和 IIIT Bangalore 的執行 PG 計劃認證結束。
節目亮點:
- 500 多個小時的內容、60 多個案例研究和項目、20 多個現場會議
- 全面覆蓋 Python、AWS、MySQL 等 14 多種工具和軟件
- 與行業專家的輔導課程
- 同行學習和行業網絡
- 360 度職業協助
作為當今最好的高等教育科技平台之一,upGrad 繼續通過結合尖端技術、最新教學法、行業合作夥伴關係和世界一流的教師來激勵和培養學習者。
從世界頂級大學在線學習數據科學課程。 獲得行政 PG 課程、高級證書課程或碩士課程,以加快您的職業生涯。
為什麼在 OOP 中使用多態性?
在 OOP 中,多態是根據調用它的對象的類執行不同任務的方法。 因此,一條消息被發送到多個類的對象,每個對像根據類的屬性進行響應。
Java中的方法重載是什麼?
在 Java 中,具有相同名稱的兩個或多個方法的參數可能不同(不同類型的參數、不同數量的參數,或兩者兼而有之)。 這樣的方法稱為重載方法,該特性稱為方法重載。
重載和覆蓋有什麼區別?
當同一類中的兩個或多個方法具有不同的參數但名稱相同時,稱為重載。 另一方面,覆蓋是當超類和子類具有相同的方法簽名(名稱和參數)時。