方法重寫

方法重寫是子型別重新定義(覆蓋)其超型別行為的能力。

在 Java 中,這轉換為子類重寫超類中定義的方法。在 Java 中,所有非原始變數實際上都是 references,它們類似於指向記憶體中實際物件位置的指標。references 只有一種型別,這是它們宣告的型別。但是,它們可以指向其宣告型別或其任何子型別的物件。

當在 reference 上呼叫方法時,將呼叫指向的實際物件的相應方法

class SuperType {
    public void sayHello(){
        System.out.println("Hello from SuperType");
    }

    public void sayBye(){
        System.out.println("Bye from SuperType");
    }
}

class SubType extends SuperType {
    // override the superclass method
    public void sayHello(){
        System.out.println("Hello from SubType");
    }
}

class Test {
    public static void main(String... args){
        SuperType superType = new SuperType();
        superType.sayHello(); // -> Hello from SuperType

        // make the reference point to an object of the subclass
        superType = new SubType();
        // behaviour is governed by the object, not by the reference
        superType.sayHello(); // -> Hello from SubType

        // non-overridden method is simply inherited
        superType.sayBye(); // -> Bye from SuperType
    }
}

要記住的規則

要覆蓋子類中的方法,重寫方法(即子類中的方法) 必須具有

  • 一樣的名字
  • 在基元的情況下相同的返回型別(類允許子類,這也稱為協變返回型別)。
  • 相同型別和順序的引數
  • 它可能只丟擲在超類的方法的 throws 子句中宣告的那些異常,或者丟擲作為宣告的異常的子類的異常。它也可以選擇不丟擲任何異常。引數型別的名稱無關緊要。例如,void methodX(int i)與 void methodX(int k)相同
  • 我們無法覆蓋 final 或 Static 方法。只有我們可以做的事情只改變方法體。