方法重寫
方法重寫是子型別重新定義(覆蓋)其超型別行為的能力。
在 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 方法。只有我們可以做的事情只改變方法體。