重載與重寫是完全不同的語法現(xiàn)象蔗坯,區(qū)別如下所示:
重載: 是指在一個類中定義多個方法名相同但參數(shù)列表不同的方法欺殿,在編譯時烟号,根據(jù)參數(shù)的個數(shù)和類型來決定綁定哪個方法蒋困。
重寫: 是指在子類中定義和父類完全相同的方法,在程序運行時矛双,根據(jù)對象的類型(而不是引用類型)而調(diào)用不同的方法渊抽。
class Super {
public void f() {
System.out.println ("super.f()");
??? }
}
class Sub extends Super {
public void f() {
System.out.println ("sub.f()");
??? }
}
class Goo {
public void g(Super obj) {
System.out.println ("g(Super)");?
obj.f();
??? }
public void g(Sub obj) {
System.out.println ("g(Sub) ");
obj.f();
??? }
}
class Test{
??? public static void main(String[] args){
??????? Super obj = new Sub();
Goo goo = new Goo();
goo.g(obj);
}
}
分析如上代碼,輸出結(jié)果為:g(Super) sub.f()议忽。
首先懒闷,重載遵循所謂“編譯期綁定”,即在編譯時根據(jù)參數(shù)變量的類型判斷應(yīng)該調(diào)用哪個方法栈幸, 因為變量obj為Super類型引用愤估, 所以,Goo的g(Super)被調(diào)用速址,先輸出g(Super)灵疮。
重寫遵循所謂“運行期綁定”,即在運行的時候壳繁,根據(jù)引用變量所指向的實際對象的類型來調(diào)用方法,因為obj實際指向的是子類Sub的對象荔棉,因此闹炉,子類重寫后的f方法被調(diào)用,即sub.f()润樱。