1.重寫一個方法,即在子類中完全取代它的功能,重寫後的方法必須和父類中的被替代方法擁有完全一致的方法簽名,包括返回值。
2.static修飾的方法不能被重寫,下面看一個容易被誤解爲static方法被重寫的例子
class Base {
static void aMethod() {
System.out.println("Base.aMethod");
}
}
public class Cravengib extends Base {
public static void main(String[] args) {
Cravengib c = new Cravengib();
c.aMethod();
Base b = new Cravengib();
b.aMethod();
}
static void aMethod() {
System.out.println("Cravengib.aMethod");
}
}
輸出結果:Cravengib.aMethod
Base.aMethod
從結果我們可以看出,static 方法與類關聯,而不是與特定的類的實例相關聯,它不在意什麼類型的類正在創建它,而僅僅在意引用的類型。
b是一個類Cravengib在內存中的一個Base類型的實例的引用,如果一個static方法被調用了JVM不會檢查什麼類型正在指向它,而只會調用跟Base類相關聯的的方法的實例。
再來看一個正確的方法重寫例子:
class Base {
void aMethod() {
System.out.println("Base.aMethod");
}
}
public class Cravengib extends Base {
public static void main(String[] args) {
Cravengib c = new Cravengib();
c.aMethod();
Base b = new Cravengib();
b.aMethod();
}
void aMethod() {
System.out.println("Cravengib.aMethod");
}
}
輸出結果:Cravengib.aMethod
Cravengib.aMethod
從輸出結果看到語句:b.aMethod();執行的是子類中的aMethod方法體,即子類中的方法完全替代了父類中被重寫的方法