Java重載方法匹配優(yōu)先級的實現(xiàn)示例
在我們學習Java的時候關于重載有個小的知識點叫方法重載匹配優(yōu)先級。雖然javac編譯器能確定方法的重載版本,但是在很多情況下重載的版本并不是唯一的,往往只能確定一個相對合適的版本。請看以下代碼你覺得輸出的內容是什么呢?(可以先不要翻到代碼結束后的答案嘗試猜測)
package cn.laoniu;
import java.io.Serializable;
public class Reload {
public void sayType(Character arg) {
System.out.println("Character");
}
public void sayType(long arg) {
System.out.println("long");
}
public void sayType(char arg) {
System.out.println("char");
}
public void sayType(char... arg) {
System.out.println("char...");
}
public void sayType(Serializable arg) {
System.out.println("Serializable");
}
public void sayType(int arg) {
System.out.println("int");
}
public void sayType(Object arg) {
System.out.println("Object");
}
public static void main(String[] args) {
new Reload().sayType('a');
}
}
上面代碼的運行后輸出結果為:
char
這很好理解,'a'是一個char類型的數(shù)據(jù),自然會尋找參數(shù)類型為char的重載方法,如果注釋掉sayType(char arg)方法,那么輸出結果會變?yōu)椋?/p>
int
這時發(fā)生了一次自動類型轉換,'a'除了可以代表一個字符串,還可以代表數(shù)字97(字符'a'的Unicode數(shù)值為十進制數(shù)字97),因此參數(shù)類型為int的重載也是合適的。我們繼續(xù)注釋掉sayType(int arg)方法,那么輸出的結果會變?yōu)椋?/p>
long
這時發(fā)生了兩次類型轉換,'a'轉型為整數(shù)97之后,進一步轉型為長整數(shù)97L,匹配參數(shù)類型為long的重載。雖然上面代碼中沒有加入其他類型如float、double等的重載,在實際上自動轉型還能繼續(xù)發(fā)生多次,按照char>int>long>float>double的順序進行匹配,但是不會匹配到byte和short類型的重載,因為char到byte和short的轉型是不安全的。我們繼續(xù)注釋掉sayType(long arg)方法,那么輸出的結果變?yōu)椋?/p>
Character
這時發(fā)生了一次自動裝箱,'a'被包裝為它的封裝類型java.lang.Character,所以匹配到了參數(shù)類型為Character的重載,繼續(xù)注釋掉sayType(Character arg)方法,那么輸出的結果會變?yōu)椋?/p>
Serializable
這個輸出可能會讓人感到疑惑,一個字符或數(shù)字與序列化有什么關系呢?出現(xiàn)Serializable是因為java.lang.Serializable是java.lang.Character類實現(xiàn)的一個接口,當自動裝箱之后發(fā)現(xiàn)還是找不到裝箱類,但是找到了裝箱類所實現(xiàn)的接口類型,所以緊接著又發(fā)生了一次自動轉型。char可以轉型為int,但是Character是絕對不會轉型為Integer的,它只能安全地轉型為它實現(xiàn)的借口或者父類。Character還實現(xiàn)了另外一個接口java.lang.Compara<Character>,如果同時出現(xiàn)兩個參數(shù)分別是Serializable和Compara<Character>的重載方法,那它們在此時的優(yōu)先級是一樣的。編譯器無法確定要自動轉型為哪種類型,會提示“類型模糊”(Type Ambiguous),并拒絕編譯。讓我們繼續(xù)注釋掉sayType(Serializable arg)方法,輸出結果會變?yōu)椋?/p>
Object
這時是char裝箱后轉型為父類了,如果有多個父類,那么繼承關系從下往上搜索,越往上層優(yōu)先級越低。即便方法調用傳入?yún)?shù)值null時,這個規(guī)則仍然適用。繼續(xù)把sayType(Object arg)方法注釋掉,結果會變?yōu)椋?/p>
char...
此時就剩下這一個方法了,可見變長參數(shù)的重載優(yōu)先級是最低的。
補充
上面例子演示了Java重載方法優(yōu)先匹配級別,這也屬于java編譯期間選擇靜態(tài)分配目標。這個例子是很極端的例子,除了作為面試題來為難應聘者之外在實際工作中幾乎不存在任何價值
到此這篇關于Java重載方法匹配優(yōu)先級的實現(xiàn)那示例的文章就介紹到這了,更多相關Java重載方法匹配優(yōu)先級內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
springboot集成mybatis?plus和dynamic-datasource注意事項說明
這篇文章主要介紹了springboot集成mybatis?plus和dynamic-datasource注意事項說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01
SpringMVC Restful api接口實現(xiàn)的代碼
本篇文章主要介紹了SpringMVC Restful api接口實現(xiàn)的代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-09-09
圖文講解IDEA中根據(jù)數(shù)據(jù)庫自動生成實體類
這篇文章主要以圖文講解IDEA中根據(jù)數(shù)據(jù)庫自動生成實體類,本文主要以Mysql數(shù)據(jù)庫為例,應該會對大家有所幫助,如果有錯誤的地方,還望指正2023-03-03
關于SpringBoot創(chuàng)建存儲令牌的媒介類和過濾器的問題
這篇文章主要介紹了SpringBoot創(chuàng)建存儲令牌的媒介類和過濾器的問題,需要在配置文件中,添加JWT需要的密匙,過期時間和緩存過期時間,具體實例代碼參考下本文2021-09-09

