重載與重寫(xiě)是完全不同的語(yǔ)法現(xiàn)象,區(qū)別如下所示:
重載: 是指在一個(gè)類中定義多個(gè)方法名相同但參數(shù)列表不同的方法,在編譯時(shí),根據(jù)參數(shù)的個(gè)數(shù)和類型來(lái)決定綁定哪個(gè)方法。
重寫(xiě): 是指在子類中定義和父類完全相同的方法,在程序運(yùn)行時(shí),根據(jù)對(duì)象的類型(而不是引用類型)而調(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()。
首先,重載遵循所謂“編譯期綁定”,即在編譯時(shí)根據(jù)參數(shù)變量的類型判斷應(yīng)該調(diào)用哪個(gè)方法, 因?yàn)樽兞縪bj為Super類型引用, 所以,Goo的g(Super)被調(diào)用,先輸出g(Super)。
重寫(xiě)遵循所謂“運(yùn)行期綁定”,即在運(yùn)行的時(shí)候,根據(jù)引用變量所指向的實(shí)際對(duì)象的類型來(lái)調(diào)用方法,因?yàn)閛bj實(shí)際指向的是子類Sub的對(duì)象,因此,子類重寫(xiě)后的f方法被調(diào)用,即sub.f()。