在本教程中,我們將通過示例學(xué)習(xí)多態(tài),不同類型的多態(tài)以及如何在Java中實現(xiàn)它們。
多態(tài)是面向?qū)ο缶幊痰闹匾拍?。它只是意味著不止一種形式。也就是說,同一實體(方法,運算符或?qū)ο螅┰诓煌闆r下的行為會有所不同。例如,
Java中的+運算符用于執(zhí)行兩個特定功能。與數(shù)字(整數(shù)和浮點數(shù))一起使用時,將執(zhí)行加法運算。
int a = 5; int b = 6; int sum = a + b; // sum = 11
當我們將+運算符與字符串一起使用時,它將執(zhí)行字符串連接。例如,
String firstName = "abc "; String lastName = "xyz"; name = firstName + lastName; // name = abc xyz
在Java中,多態(tài)可以分為兩種類型:
運行時多態(tài)
編譯時多態(tài)
在Java中,可以通過方法重寫來實現(xiàn)運行時多態(tài)。
假設(shè)在父類及其子類中創(chuàng)建了相同的方法。在這種情況下,將要調(diào)用的方法取決于用于調(diào)用該方法的對象。例如,
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...
要了解方法重寫的工作原理,請訪問Java中的方法重寫。
在上面的示例中,該方法makeSound()在兩個不同的類中具有不同的實現(xiàn)。當我們運行程序時
表達式d1.makeSound()將調(diào)用Dog類的方法。這是因為d1是Dog類的對象。
表達式c1.makeSound()將調(diào)用Cat類的方法。這是因為c1是Cat類的對象。
在程序執(zhí)行期間確定將要調(diào)用的方法。因此,方法重寫是運行時多態(tài)。
可以通過Java中的方法重載和運算符重載來實現(xiàn)編譯時多態(tài)。
在Java類中,如果參數(shù)不同,則可以使用相同的名稱創(chuàng)建方法。例如,
void func() { ... } void func(int a) { ... } float func(double a) { ... } float func(int a, float b) { ... }
這在Java中稱為方法重載。
讓我們以方法重載為例。
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()方法已重載。
如果我們在不傳遞任何參數(shù)的情況下調(diào)用該方法,則會創(chuàng)建 * 字符的圖案。
如果我們通過將字符作為參數(shù)傳遞來調(diào)用該方法,則會創(chuàng)建 # 字符的圖案。
要了解有關(guān)方法重載的更多信息,請訪問方法重載
在方法重寫的情況下,方法應(yīng)該在不同的類中。然而,在方法重載的情況下,方法應(yīng)該在同一個類中。
方法重寫在運行時執(zhí)行,而方法重載在編譯時執(zhí)行。
Java中的某些運算符對不同的操作數(shù)的行為有所不同。例如,
+ 運算符被重載以執(zhí)行數(shù)字加法和字符串連接。
&、|和!為邏輯和按位操作重載。
讓我們看看運算符如何在Java中重載。
Java中的+運算符用于執(zhí)行兩個特定功能。與數(shù)字(整數(shù)和浮點數(shù))一起使用時,將執(zhí)行加法運算。例如,
int a = 5; int b = 6; int sum = a + b; // sum = 11
當我們將+運算符與字符串一起使用時,它將執(zhí)行字符串連接。例如,
String firstName = "abc "; String lastName = "xyz"; name = firstName + lastName; // name = abc xyz
在像C ++這樣的語言中,我們可以定義運算符以對不同的操作數(shù)進行不同的處理。但是,Java不支持用戶定義的運算符重載。
多態(tài)允許我們創(chuàng)建一致的代碼。例如,
假設(shè)我們需要繪制一個圓和一個正方形。為此,我們可以創(chuàng)建一個Polygon類,Circle和square從中繼承兩個子類。 在這種情況下,有必要在這兩個子類中創(chuàng)建一個具有相同名稱render()的方法,而不是創(chuàng)建具有不同名稱的方法。
在我們的方法重載示例中,我們使用相同的方法名稱displayPattern()來顯示兩個不同的圖案,以保持一致性。
Java中的print()方法也是多態(tài)性(方法重載)的一個實例。同樣的方法用于打印不同類型的值,如char、int、String等。我們還可以使用相同的方法一次打印多個值。
在Java中,對象變量(實例變量)表示多態(tài)變量的行為。這是因為類的對象變量可以引用其類的對象及其子類的對象。例如,
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類的對象變量a1 Animal a1; //創(chuàng)建Animal類的對象 a1 = new Animal(); a1.displayInfo(); //dog類的對象創(chuàng)建 a1 = new Dog(); a1.displayInfo(); } }
輸出:
I am an animal. I am a dog.
在上面的示例中,我們創(chuàng)建了Animal類的對象變量a1。在這里,a1是一個多態(tài)變量。
這是因為,
在語句中 a1 = new Animal(),a1引用Animal類的對象。
在語句中 a1 = new Dog(),a1引用Dog類的對象。
這是Java中的向上轉(zhuǎn)型示例。要了解更多信息,請訪問Java向上轉(zhuǎn)換和向下轉(zhuǎn)換。