Java 菜鳥(niǎo)教程

Java 流程控制

Java 數(shù)組

Java 面向?qū)ο?I)

Java 面向?qū)ο?II)

Java 面向?qū)ο?III)

Java 異常處理

Java 列表(List)

Java Queue(隊(duì)列)

Java Map集合

Java Set集合

Java 輸入輸出(I/O)

Java Reader/Writer

Java 其他主題

Java 多態(tài)

在本教程中,我們將通過(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

多態(tài)性的類(lèi)型

在Java中,多態(tài)可以分為兩種類(lèi)型:

  • 運(yùn)行時(shí)多態(tài)

  • 編譯時(shí)多態(tài)

運(yùn)行時(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ì)象。例如,

示例1:方法重寫(xiě)

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ì)象。

Java中使用方法覆蓋的運(yùn)行時(shí)多態(tài)

在程序執(zhí)行期間確定將要調(diào)用的方法。因此,方法重寫(xiě)是運(yùn)行時(shí)多態(tài)。

編譯時(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)為方法重載。

讓我們以方法重載為例。

示例3:方法重載

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)建 # 字符的圖案。

使用方法重載在Java中編譯時(shí)間多態(tài)

要了解有關(guān)方法重載的更多信息,請(qǐng)?jiān)L問(wèn)方法重載

Java方法重載 VS 方法重寫(xiě)

  • 在方法重寫(xiě)的情況下,方法應(yīng)該在不同的類(lèi)中。然而,在方法重載的情況下,方法應(yīng)該在同一個(gè)類(lèi)中。

  •  方法重寫(xiě)在運(yùn)行時(shí)執(zhí)行,而方法重載在編譯時(shí)執(zhí)行。

運(yùn)算符重載

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)?

多態(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è)值。

多態(tài)變量

在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)換。

丰满人妻一级特黄a大片,午夜无码免费福利一级,欧美亚洲精品在线,国产婷婷成人久久Av免费高清