目錄
一、過載定義
二、過載問題
2.1、複雜過載案例
2.2、過載呼叫順序
2.3、延伸思考
在同乙個類中,如果多個方法擁有相同的名字、不同的引數,即稱為方法過載。string類中的valueof()就是比較著名的過載案例,可以將輸入的基本資料型別、陣列、object等轉換成字串。
在jvm眼中,方法名稱+引數型別+引數個數,組成乙個唯一鍵,成為方法簽名。jvm通過這個唯一鍵決定呼叫那個方法。如
public class overloadmethods
/*** 2.基本資料型別
*/public void overloadmethod(int param)
}
上例中很容易判斷呼叫哪種過載方法,但是當加入包裝類和可變參時,會如何呢,見下例子,呼叫overloadmethod(7)。
public class overloadmethods
/*** 2.基本資料型別
*/public void overloadmethod(int param)
/*** 3.包裝類
*/public void overloadmethod(integer param)
/*** 4.可變參,可接收0~n個integer引數
*/public void overloadmethod(integer... param)
/*** 5.object引數
*/public void overloadmethod(object param)
}
呼叫overloadmethod(7),到底會呼叫誰呢?答案是2,引數為基本資料型別int的方法。
jvm在過載方法中,選擇合適的目標方法的順序如下:
①精確匹配
②如果是基本資料型別,自動轉換成更大範圍的基本型別
③通過自動拆箱與裝箱
④通過子類向上轉繼承路線依次匹配
⑤通過可變引數匹配
精確匹配優先,int和integer勝出,因為不需要自動裝箱,因此overloadmethod(7)會呼叫int引數的方法。如果是new integer(7),integer引數的方法將勝出。
如果本方法只有overloadmethod(long param),則可接收overloadmethod(7)的實參呼叫;反之,如果只有overloadmethod(int param),而傳入long值,則會編譯出錯。基本資料型別轉化為表示範圍更大的基本資料型別優先於
自動裝箱,即int轉為long,優先於自動裝箱。
如果乙個類中只有overloadmethod(object param)和overloadmethod(integer...param)兩種方法,根據目標方法匹配順序,overloadmethod(7)先自動裝箱,然後向上轉型,匹配object。這個規則優先於呼叫可變參的過載方法。
如果呼叫overloadmethod(null),則會呼叫引數為integer的方法。null可以匹配任何對物件,在查詢目標方法時,是從最底層子類依次向上查詢的。integer是object的子類,所以會先與object匹配。
根據上次匹配順序,可變引數在競爭中明顯處於弱勢地位。如果呼叫overloadmethod(13,14),此時有兩個引數,雖然有自動裝箱的開銷,但可變引數仍會執行這種方法請求。
由上所述,7是匹配基本型別優先,new integer(7)是匹配包裝類優先,那麼如下定義會怎樣呢?
public void overloadmethod(int param1, integer param2)
public void overloadmethod(integer param1, int param2)
如上定義編譯是可通過的,也是一種過載方式。但是此時呼叫overloadmethod(7,8)會出現呼叫出錯(ambiguous method call. both兩者都匹配,引用不明確)。 JavaSE 3th 方法的過載
方法的過載 test類中有如下void max int a,int b 方法用於列印出兩個int型別的數中最大的數,但如果實參為float型別或double型別,該方法就不可用了。class test 於是新增了兩個方法如下 class test void maxfloat float a,floa...
方法的過載之可變數量的引數
示例 public class adhero extends hero 可變數量的引數 public void attack hero.heros public static void main string args 設計乙個類support 輔助英雄 繼承hero,提供乙個heal 方法 對su...
JAVA SE基礎 17 方法的過載
方法過載 方法過載就是方法名稱重複,載入引數不同。具體規範 一.方法名一定要相同。二.方法的參數列必須不同,包括引數的型別或個數,以此區分不同的方法體。1.如果引數個數不同,就不管它的引數型別了!2.如果引數個數相同,那麼引數的型別或者引數的順序必須不同。三.方法的返回型別 修飾符可以相同,也可不同...