前言:
本篇我們來解釋一下什么是多態(tài)關(guān)系,多態(tài)關(guān)系屬于面向?qū)ο笕筇卣鞯淖詈笠粋€,可以說面向?qū)ο蟮闹攸c(diǎn)就在多態(tài),因此我們要學(xué)好面向?qū)ο缶幊趟枷耄鸵獙W(xué)好多態(tài)。
多態(tài):
????????Java中的多態(tài)是指同一類對象在不同情況下可能表現(xiàn)出不同的形態(tài)和行為。它包括了方法重載和方法重寫兩種形式。
????????方法重載是指在同一個類中定義了兩個或多個方法,它們的方法名相同,但參數(shù)類型、個數(shù)或順序不同。當(dāng)程序調(diào)用這個方法時,根據(jù)傳入的參數(shù)類型自動匹配最合適的方法進(jìn)行執(zhí)行。
????????方法重寫是指子類重寫父類的某一個方法,方法名和參數(shù)列表都必須相同。當(dāng)程序調(diào)用該方法時,會首先查找子類中是否存在該方法,如果存在則執(zhí)行子類中的方法,如果不存在則會向上查找父類中是否有該方法,直到找到為止。
????????多態(tài)使得同一類對象可以表現(xiàn)出不同的行為,增強(qiáng)了程序的靈活性和擴(kuò)展性,也是面向?qū)ο缶幊痰幕咎卣髦弧T贘ava中,多態(tài)實(shí)現(xiàn)通過繼承、接口和抽象類等機(jī)制來實(shí)現(xiàn)。
多態(tài)的表現(xiàn)形式:
- 父類類型 名稱 =子類對象;
多態(tài)的前提:
- 有繼承關(guān)系。
- 有父類引用指向子類對象。
- 有方法重寫。
多態(tài)調(diào)用成員變量特點(diǎn):
-
變量調(diào)用:編譯看左邊,運(yùn)行看右邊。
-
方法調(diào)用:編譯看左邊,運(yùn)行看右邊
package testo1;
public class test02 {
public static void main(String[] args) {
//利用多態(tài)創(chuàng)建對象。
Animal a= new dog();
//調(diào)用成員變量是編譯看左邊,運(yùn)行看左邊。
System.out.println(a.name);
//調(diào)用成員方法:
//編譯看左邊,運(yùn)行看右邊。
a.show();
}
}
class Animal{
String name ="動物";
public void show()
{
System.out.println("animal-------show");
}
}
class dog extends Animal{
String name ="狗";
@Override
public void show ()
{
System.out.println("dog---------show");
}
}
class cat extends Animal{
String name ="狗";
@Override
public void show ()
{
System.out.println("cat---------show");
}
}
運(yùn)行結(jié)果:
在這個調(diào)用中我們可以發(fā)現(xiàn):成員變量會隨著建立對象的不同而不同。例如我們明明是Animal類型的對象,卻打印了dog里面的方法。
如果子類對父類方法進(jìn)行了重寫,那么在虛方法表中是會對父類的方法進(jìn)行覆蓋的。
其實(shí)可以類比于C++里面的多態(tài),感興趣的同學(xué)可以點(diǎn)擊這篇文章進(jìn)行觀看
C++ 動態(tài)多態(tài)實(shí)現(xiàn)底層邏輯_我是一盤牛肉的博客-CSDN博客
多態(tài)的優(yōu)點(diǎn):
1. 增強(qiáng)程序的靈活性:通過多態(tài)機(jī)制,同一個類型的不同對象可以表現(xiàn)出不同的行為。這使得程序的調(diào)用方式更加靈活,可以針對不同的對象調(diào)用不同的方法,無需為每一個具體對象都單獨(dú)編寫方法。
2. 提高代碼的復(fù)用性:通過抽象類和接口,多態(tài)能夠很好地實(shí)現(xiàn)代碼的復(fù)用。在編寫抽象類和接口時,我們可以定義一些通用的方法和屬性,這些方法和屬性可以被具體的子類繼承和實(shí)現(xiàn),從而減少代碼的重復(fù)編寫。
3. 提高程序的可擴(kuò)展性:通過多態(tài)機(jī)制,在程序的運(yùn)行過程中,可以動態(tài)地替換對象的行為。這使得程序的擴(kuò)展性更加優(yōu)秀,增加新的功能時,只需要添加新的類和方法即可,無需修改已有的代碼。
4. 提高程序的可維護(hù)性:多態(tài)使得代碼更加松散耦合,不同的類之間的關(guān)系更加清晰明了。這使得程序的維護(hù)性更好,對于模塊性較強(qiáng)的程序,修改和維護(hù)的難度大大降低。
因此,多態(tài)在面向?qū)ο缶幊讨芯哂兄匾淖饔?,能夠提高程序的靈活性、可復(fù)用性、可擴(kuò)展性和可維護(hù)性。
多態(tài)的缺點(diǎn):
1. 程序執(zhí)行效率略低:由于多態(tài)的實(shí)現(xiàn)需要動態(tài)綁定,即在運(yùn)行時才能確定對象的類型和方法的執(zhí)行地址,所以程序的執(zhí)行效率會略微降低。
2. 代碼可讀性不高:由于多態(tài)性質(zhì)的特殊性,程序中可能出現(xiàn)一個方法被多次重載、覆蓋的情況,這樣會使得代碼的可讀性變差,不容易理解。
3. 可能會造成誤解或錯誤:由于父類無法完全限制子類的行為,所以在使用多態(tài)時,很容易陷入到某些無法預(yù)知的情況下,例如僅僅使用父類的屬性而忽略了子類的某些特殊屬性或方法,從而出現(xiàn)意外結(jié)果或錯誤。
雖然多態(tài)存在一些缺點(diǎn),但是這些缺點(diǎn)可以通過適當(dāng)?shù)木幋a和測試來避免。在實(shí)際編程中,正確使用多態(tài),在對程序的可維護(hù)性、可擴(kuò)展性以及靈活性等方面都具有重要意義。
?因?yàn)楦割惒豢梢哉{(diào)用子類的特有功能,因此例如我們在子類中的函數(shù),如果我們的創(chuàng)建對象是父類,那么就無法使用這個方法,因此我們在JAVA中設(shè)置了轉(zhuǎn)型
轉(zhuǎn)型:
多態(tài)的轉(zhuǎn)型是指通過類型轉(zhuǎn)換,將一個對象在繼承關(guān)系中沿著層次向上或向下進(jìn)行類型轉(zhuǎn)換,在轉(zhuǎn)型過程中可以訪問不同層次的方法和變量。
在Java中,類型轉(zhuǎn)換分為向上轉(zhuǎn)型和向下轉(zhuǎn)型兩種:
- 向上轉(zhuǎn)型:將子類轉(zhuǎn)換為父類對象,這種轉(zhuǎn)換不需要進(jìn)行特殊處理,自動完成向上轉(zhuǎn)型。例如:Animal animal = new Cat(),Cat類是Animal類的子類,在這里就進(jìn)行了向上轉(zhuǎn)型。
- 向下轉(zhuǎn)型:將父類對象轉(zhuǎn)換為子類對象,需要強(qiáng)制類型轉(zhuǎn)換才能實(shí)現(xiàn)。例如:Cat cat = (Cat) animal,在這里需要將Animal類型的對象進(jìn)行強(qiáng)制類型轉(zhuǎn)換為Cat對象,才能實(shí)現(xiàn)向下轉(zhuǎn)型。
需要注意的是,在進(jìn)行向下轉(zhuǎn)型之前,必須進(jìn)行向上轉(zhuǎn)型,否則會報錯。另外,在進(jìn)行向下轉(zhuǎn)型時,必須保證進(jìn)行轉(zhuǎn)換的對象是正確的類型,否則也會報錯。
下面給出一個Java多態(tài)中的類型轉(zhuǎn)換示例,通過向上轉(zhuǎn)型和向下轉(zhuǎn)型操作,來演示多態(tài)的轉(zhuǎn)型過程:
interface Animal {
? ? public void eat();
}
class Cat implements Animal {
? ? public void eat() {
? ? ? ? System.out.println("Cat eat fish.");
? ? }
? ? public void meow() {
? ? ? ? System.out.println("Cat say meow.");
? ? }
}
public class Main {
? ? public static void main(String[] args) {
? ? ? ? Animal animal = new Cat();
? ? ? ? animal.eat();
? ? ? ? Cat cat = (Cat) animal;
? ? ? ? cat.eat();
? ? ? ? cat.meow();
? ? }
}
在上述代碼中,首先定義了一個接口 Animal,包含一個抽象方法 eat()。接著,定義一個實(shí)現(xiàn)了 Animal 接口的類 Cat,并且在 Cat 類中實(shí)現(xiàn)了 eat() 方法和 meow() 方法。在主方法中,創(chuàng)建了 Animal 類型的引用 animal,并將其設(shè)置為 Cat 類的實(shí)例。由于 Cat 類是 Animal 類的子類,因此可以進(jìn)行向上轉(zhuǎn)型。接著對 animal 調(diào)用 eat() 方法,輸出“Cat eat fish.”。
接下來進(jìn)行向下轉(zhuǎn)型,在將 Animal 類型的引用 animal 轉(zhuǎn)換為 Cat 類型的引用 cat。在向下轉(zhuǎn)型后,可以調(diào)用 Cat 類特有的方法 meow(),輸出“Cat say meow.”。
需要注意的是,在進(jìn)行向下轉(zhuǎn)型之前,必須進(jìn)行向上轉(zhuǎn)型。否則將會出現(xiàn)編譯錯誤。同時,當(dāng)進(jìn)行向下轉(zhuǎn)型時,必須進(jìn)行類型檢查,保證進(jìn)行轉(zhuǎn)換的對象是正確的類型。否則將會出現(xiàn)運(yùn)行時錯誤。
總結(jié):
多態(tài)更加豐富了子類與父類之間的關(guān)系網(wǎng),更加完善了JAVA的功能,學(xué)好面向?qū)ο笕筇卣骱苤匾魑灰炀氄莆者@里的內(nèi)容,才可以更加?jì)故斓氖褂肑AVA。
如果我的內(nèi)容對你有幫助,請點(diǎn)贊,評論,收藏。創(chuàng)作不易,大家的支持就是我堅(jiān)持下去的動力!文章來源:http://www.zghlxwxcb.cn/news/detail-498491.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-498491.html
到了這里,關(guān)于【從零開始學(xué)習(xí)JAVA | 第十五篇】 多態(tài)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!