1:重載是指一個類中定義多個方法名相同但參數列表不同的方法,在編譯時根據方法參數的個數和類型來決定綁定哪個方法;
? 重寫是指在子類中定義和父類方法簽名完全一樣的方法,在程序運行時根據對象的類型不同而調用不同的方法。(注意不是對象的引用)
? 看如下代碼:
public class Test {
public static void main(String args[]) {
SuperF obj = new Sub();
Goo goo = new Goo();
goo.g(obj);
}
}
class SuperF{
public void f() {
System.out.println("Super.f()");
}
}
class Sub extends SuperF{
public void f() {
System.out.println("Sub.f()");
}
}
class Goo{
public void g(SuperF obj) {
System.out.println("g(SuperF)");
obj.f();
}
public void g(sub obj) {
System.out.println("g(sub)");
obj.f();
}
}
結果輸出:
g(SuperF)
Sub.f()
?
2:重載遵循所謂的“編譯期綁定”,即在編譯期根據參數變量的類型決定該調用哪個方法。上面代碼中obj的類型為SuperF,因此Goo的g(SuperF obj)被調用
? 重寫遵循所謂的“運行期綁定”,即在運行時根據引用指向的實際對象來決定調用哪個方法。上面代碼中obj指向的實際對象為Sub類型,因此會調用Sub重寫后的f()方法。