public class methodoverridevsoverload/*** @param args
*/public static void main(string args)
if(o3.equals(o4))
}}
結果輸出是:
methodoverridevsoverload
object o3 and o4 is equal.
為什麼會這樣呢?
首先要搞清楚過載和重寫的關係。
過載指的是同乙個類中,方法名相同但形參列表不同,過載是編譯時靜態繫結的。
重寫則是指,子類覆蓋父類的同名方法,重寫是執行時動態繫結的。
對於子類重寫的要求如下:
引數列表,返回值(可以是子類)均不可變。
可以丟擲更少的異常,但不可丟擲父類未宣告的異常。
訪問許可權比起父類要更寬鬆。
執行時根據物件型別來決定呼叫的方法。
看回程式,public boolean equals()方法看起來是跟object的equals方法有點像,實際上形參不一樣,所以這裡應該是方法過載而不是重寫。
o1,o2實際上是呼叫了object的equals方法,因為他們的編譯時型別是object,而o3,o4則是呼叫methodoverridevsoverload的方法。
怎樣解決這個問題呢?
使用乙個annotation來進行說明,@override,當用了這個annotation時,因為形參列表不一樣,則會報錯。
@overridepublic boolean equals(object other)
這時候的結果是:
methodoverridevsoverload
object o1 and o2 is equal.
methodoverridevsoverload
object o3 and o4 is equal.
過載overload和重寫overried的區別
過載 是指允許存在多個同名函式,而這些函式的參數列不同 或許引數個數不同,或許引數型別不同,或許兩者都不同 編譯器根據函式不同的引數列表,對同名函式的名稱做修飾,然後這些同名函式就成了不同的函式。有兩個同名函式int func int 和int func string 那麼編譯器做過修飾後的函式名稱...
過載(Overload)和重寫(Override)
public void test int a public string test int a,string b class animal class dogextends animal public class test 執行結果 動物可以移動 狗可以跑animal b new dog 大家可能有...
過載(overload 和重寫(override)
重寫方法的過載和方法的重寫的區別 對於類似的多個方法,全部都是執行類似的操作,但是因為引數列表不一樣,所以需要記住的名字太多。使用方法過載可以很好的解決這個問題。對於類似功能的多個方法,只要記住乙個方法名即可,可以自動的根據引數列表中引數的個數的不同來適配。方法過載 overload 方法名相同,但...