JavaRush /Java Blog /Random-TW /Java中的方法重寫機製或Override

Java中的方法重寫機製或Override

在 Random-TW 群組發布
你好!您已經使用過 Java 中的方法並且對它們了解很多。您可能遇到過這樣的情況:一個類別中有許多具有相同名稱但參數不同的方法。如果您還記得,在這些情況下我們使用了方法重載機制。今天我們來看一個不同的情況。想像一下,我們有一個通用方法,但它應該根據呼叫它的類別來執行不同的操作。如何實施這種行為?為了弄清楚這一點,讓我們採用一個Animal表示動物的父類並在其中創建一個方法voice- “ voice ”:
public class Animal {

   public void voice() {

       System.out.println("Voice!");
   }
}
儘管我們剛開始編寫程序,但您很可能會看到潛在的問題:世界上有很多動物,它們的「說話」方式都不同:貓喵叫、鴨子嘎嘎叫、蛇嘶嘶聲。 方法重寫機制如何運作 - 2 我們的目標很簡單:避免創建一堆投票方法。我們不希望創造喵voiceCat()喵聲、voiceSnake()嘶嘶聲等方法,而是希望voice()在呼叫方法時蛇發出嘶嘶聲、貓發出喵叫聲、狗發出吠叫聲。我們可以使用方法重寫機制(Java中的Override)輕鬆實現這一點。維基百科對術語「覆蓋」給出了以下解釋: 物件導向程式設計中的方法覆蓋是程式語言的功能之一,它允許子類別或子類別提供已在超類別之一中實現的方法的特定實作。或家長班。總的來說,這是正確的。重寫允許您採用父類別的方法並在每個後代類別中編寫您自己的該方法的實作。新的實作將「替換」子類別中的父類別。讓我們透過一個例子來看看它是什麼樣子的。讓我們為我們的類別建立 4 個後繼類別: Animal
public class Bear extends Animal {
   @Override
   public void voice() {
       System.out.println("Р-р-р!");
   }
}
public class Cat extends Animal {

   @Override
   public void voice() {
       System.out.println("Meow!");
   }
}

public class Dog extends Animal {

   @Override
   public void voice() {
       System.out.println("Woof!");
   }
}


public class Snake extends Animal {

   @Override
   public void voice() {
       System.out.println("Ш-ш-ш!");
   }
}
未來的一個小技巧:要重寫父類別的方法,請前往Intellij IDE a 中的後代類別的程式碼,按Ctrl+O並從選單中選擇「重寫方法... 」。從一開始就習慣使用熱鍵,它會加快編寫程式的速度!為了設定我們想要的行為,我們做了一些事情:
  1. 我們在每個後代類別中創建了一個與父類別中的方法同名的方法。
  2. 我們告訴編譯器我們將該方法命名為與父類別中相同的方法是有原因的:我們想重寫它的行為。為了向編譯器傳遞這個“訊息”,我們在方法上加入了@Override 註解
    放置在方法上方的 @Override 註釋告訴編譯器(以及也閱讀您程式碼的程式設計師):「一切都很好,這不是一個錯誤或我的健忘。我記得這樣的方法已經存在,我想覆蓋它。”

  3. 我們為每個後代類別編寫了所需的實作。當被召喚時,蛇voice()應該發出嘶嘶聲,熊應該咆哮,等等。
讓我們看看這在程序中是如何運作的:
public class Main {

   public static void main(String[] args) {

       Animal animal1 = new Dog();
       Animal animal2 = new Cat();
       Animal animal3 = new Bear();
       Animal animal4 = new Snake();

       animal1.voice();
       animal2.voice();
       animal3.voice();
       animal4.voice();
   }
}
控制台輸出: 汪!喵!呃呃!噓! 太好了,一切都如預期進行!我們創建了父類別的 4 個引用變量Animal,並將它們分配給後代類別的 4 個不同物件。因此,每個物件的行為都不同。對於每個後代類,重寫的方法替換了該類別中的voice()“本機”方法(它只是將“Voice!”輸出到控制台)。 覆蓋有許多限制: voice()Animal方法重寫機制如何運作 - 3
  1. 重寫的方法必須具有與父方法相同的參數。

    voice如果父類別中的方法接受作為輸入String,則子類別中重寫的方法也必須接受作為輸入String,否則編譯器將拋出錯誤:

    public class Animal {
    
       public void voice(String s) {
    
           System.out.println("Voice! " + s);
       }
    }
    
    public class Cat extends Animal {
    
       @Override//error!
       public void voice() {
           System.out.println("Meow!");
       }
    }

  2. 重寫的方法必須具有與父方法相同的傳回類型。

    否則,我們會收到編譯錯誤:

    public class Animal {
    
       public void voice() {
    
           System.out.println("Voice!");
       }
    }
    
    
    public class Cat extends Animal {
    
       @Override
       public String voice() {         //error!
           System.out.println("Meow!");
           return "Meow!";
       }
    }

  3. 重寫方法的存取修飾符也不能與「原始」方法不同:

    public class Animal {
    
       public void voice() {
    
           System.out.println("Voice!");
       }
    }
    
    public class Cat extends Animal {
    
       @Override
       private void voice() {      //error!
           System.out.println("Meow!");
       }
    }
Java中的方法重寫是實現多態思想(OOP的原理,我們上一講過)的工具之一。因此,使用它的主要優點是我們之前討論過的靈活性。我們可以建立一個簡單且邏輯的類別系統,每個類別都有特定的行為(狗吠、貓喵叫),但具有單一介面 - 一個方法適用於所有方法,voice()而不是一堆方法等。 voiceDog()voiceCat()
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION