在本教程中,我們將通過(guò)示例學(xué)習(xí)多態(tài),不同類(lèi)型的多態(tài)以及如何在Java中實(shí)現(xiàn)它們。
多態(tài)是面向?qū)ο缶幊痰闹匾拍睢K皇且馕吨恢挂环N形式。也就是說(shuō),同一實(shí)體(方法,運(yùn)算符或?qū)ο螅┰诓煌闆r下的行為會(huì)有所不同。例如,
Java中的+運(yùn)算符用于執(zhí)行兩個(gè)特定功能。與數(shù)字(整數(shù)和浮點(diǎn)數(shù))一起使用時(shí),將執(zhí)行加法運(yùn)算。
int a = 5; int b = 6; int sum = a + b; // sum = 11
當(dāng)我們將+運(yùn)算符與字符串一起使用時(shí),它將執(zhí)行字符串連接。例如,
String firstName = "abc "; String lastName = "xyz"; name = firstName + lastName; // name = abc xyz
在Java中,多態(tài)可以分為兩種類(lèi)型:
運(yùn)行時(shí)多態(tài)
編譯時(shí)多態(tài)
在Java中,可以通過(guò)方法重寫(xiě)來(lái)實(shí)現(xiàn)運(yùn)行時(shí)多態(tài)。
假設(shè)在父類(lèi)及其子類(lèi)中創(chuàng)建了相同的方法。在這種情況下,將要調(diào)用的方法取決于用于調(diào)用該方法的對(duì)象。例如,
abstract class Animal { public abstract void makeSound(); } class Dog extends Animal { @Override public void makeSound() { System.out.println("Bark bark.."); } } class Cat extends Animal { @Override public void makeSound() { System.out.println("Meow meow.."); } } class Main { public static void main(String[] args) { Dog d1 = new Dog(); d1.makeSound(); Cat c1 = new Cat(); c1.makeSound(); } }
輸出:
Bark bark… Meow-meow...
要了解方法重寫(xiě)的工作原理,請(qǐng)?jiān)L問(wèn)Java中的方法重寫(xiě)。
在上面的示例中,該方法makeSound()在兩個(gè)不同的類(lèi)中具有不同的實(shí)現(xiàn)。當(dāng)我們運(yùn)行程序時(shí)
表達(dá)式d1.makeSound()將調(diào)用Dog類(lèi)的方法。這是因?yàn)閐1是Dog類(lèi)的對(duì)象。
表達(dá)式c1.makeSound()將調(diào)用Cat類(lèi)的方法。這是因?yàn)閏1是Cat類(lèi)的對(duì)象。
在程序執(zhí)行期間確定將要調(diào)用的方法。因此,方法重寫(xiě)是運(yùn)行時(shí)多態(tài)。
可以通過(guò)Java中的方法重載和運(yùn)算符重載來(lái)實(shí)現(xiàn)編譯時(shí)多態(tài)。
在Java類(lèi)中,如果參數(shù)不同,則可以使用相同的名稱(chēng)創(chuàng)建方法。例如,
void func() { ... } void func(int a) { ... } float func(double a) { ... } float func(int a, float b) { ... }
這在Java中稱(chēng)為方法重載。
讓我們以方法重載為例。
class Demo { public void displayPattern(){ for(int i = 0; i < 10; i++) { System.out.print("*"); } } public void displayPattern(char symbol) { for(int i = 0; i < 10; i++) { System.out.print(symbol); } } } class Main { public static void main(String[] args) { Demo d1 = new Demo(); d1.displayPattern(); System.out.println("\n"); d1.displayPattern('#'); } }
輸出:
********** ##########
在上面的程序中,displayPattern()方法已重載。
如果我們?cè)诓粋鬟f任何參數(shù)的情況下調(diào)用該方法,則會(huì)創(chuàng)建 * 字符的圖案。
如果我們通過(guò)將字符作為參數(shù)傳遞來(lái)調(diào)用該方法,則會(huì)創(chuàng)建 # 字符的圖案。
要了解有關(guān)方法重載的更多信息,請(qǐng)?jiān)L問(wèn)方法重載
在方法重寫(xiě)的情況下,方法應(yīng)該在不同的類(lèi)中。然而,在方法重載的情況下,方法應(yīng)該在同一個(gè)類(lèi)中。
方法重寫(xiě)在運(yùn)行時(shí)執(zhí)行,而方法重載在編譯時(shí)執(zhí)行。
Java中的某些運(yùn)算符對(duì)不同的操作數(shù)的行為有所不同。例如,
+ 運(yùn)算符被重載以執(zhí)行數(shù)字加法和字符串連接。
&、|和!為邏輯和按位操作重載。
讓我們看看運(yùn)算符如何在Java中重載。
Java中的+運(yùn)算符用于執(zhí)行兩個(gè)特定功能。與數(shù)字(整數(shù)和浮點(diǎn)數(shù))一起使用時(shí),將執(zhí)行加法運(yùn)算。例如,
int a = 5; int b = 6; int sum = a + b; // sum = 11
當(dāng)我們將+運(yùn)算符與字符串一起使用時(shí),它將執(zhí)行字符串連接。例如,
String firstName = "abc "; String lastName = "xyz"; name = firstName + lastName; // name = abc xyz
在像C ++這樣的語(yǔ)言中,我們可以定義運(yùn)算符以對(duì)不同的操作數(shù)進(jìn)行不同的處理。但是,Java不支持用戶(hù)定義的運(yùn)算符重載。
多態(tài)允許我們創(chuàng)建一致的代碼。例如,
假設(shè)我們需要繪制一個(gè)圓和一個(gè)正方形。為此,我們可以創(chuàng)建一個(gè)Polygon類(lèi),Circle和square從中繼承兩個(gè)子類(lèi)。 在這種情況下,有必要在這兩個(gè)子類(lèi)中創(chuàng)建一個(gè)具有相同名稱(chēng)render()的方法,而不是創(chuàng)建具有不同名稱(chēng)的方法。
在我們的方法重載示例中,我們使用相同的方法名稱(chēng)displayPattern()來(lái)顯示兩個(gè)不同的圖案,以保持一致性。
Java中的print()方法也是多態(tài)性(方法重載)的一個(gè)實(shí)例。同樣的方法用于打印不同類(lèi)型的值,如char、int、String等。我們還可以使用相同的方法一次打印多個(gè)值。
在Java中,對(duì)象變量(實(shí)例變量)表示多態(tài)變量的行為。這是因?yàn)轭?lèi)的對(duì)象變量可以引用其類(lèi)的對(duì)象及其子類(lèi)的對(duì)象。例如,
class Animal { public void displayInfo() { System.out.println("I am an animal."); } } class Dog extends Animal { @Override public void displayInfo() { System.out.println("I am a dog."); } } class Main { public static void main(String[] args) { //聲明Animal類(lèi)的對(duì)象變量a1 Animal a1; //創(chuàng)建Animal類(lèi)的對(duì)象 a1 = new Animal(); a1.displayInfo(); //dog類(lèi)的對(duì)象創(chuàng)建 a1 = new Dog(); a1.displayInfo(); } }
輸出:
I am an animal. I am a dog.
在上面的示例中,我們創(chuàng)建了Animal類(lèi)的對(duì)象變量a1。在這里,a1是一個(gè)多態(tài)變量。
這是因?yàn)椋?/p>
在語(yǔ)句中 a1 = new Animal(),a1引用Animal類(lèi)的對(duì)象。
在語(yǔ)句中 a1 = new Dog(),a1引用Dog類(lèi)的對(duì)象。
這是Java中的向上轉(zhuǎn)型示例。要了解更多信息,請(qǐng)?jiān)L問(wèn)Java向上轉(zhuǎn)換和向下轉(zhuǎn)換。