Java重載方法匹配優(yōu)先級(jí)的實(shí)現(xiàn)示例
在我們學(xué)習(xí)Java的時(shí)候關(guān)于重載有個(gè)小的知識(shí)點(diǎn)叫方法重載匹配優(yōu)先級(jí)。雖然javac編譯器能確定方法的重載版本,但是在很多情況下重載的版本并不是唯一的,往往只能確定一個(gè)相對(duì)合適的版本。請(qǐng)看以下代碼你覺得輸出的內(nèi)容是什么呢?(可以先不要翻到代碼結(jié)束后的答案嘗試猜測(cè))
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');
}
}
上面代碼的運(yùn)行后輸出結(jié)果為:
char
這很好理解,'a'是一個(gè)char類型的數(shù)據(jù),自然會(huì)尋找參數(shù)類型為char的重載方法,如果注釋掉sayType(char arg)方法,那么輸出結(jié)果會(huì)變?yōu)椋?/p>
int
這時(shí)發(fā)生了一次自動(dòng)類型轉(zhuǎn)換,'a'除了可以代表一個(gè)字符串,還可以代表數(shù)字97(字符'a'的Unicode數(shù)值為十進(jìn)制數(shù)字97),因此參數(shù)類型為int的重載也是合適的。我們繼續(xù)注釋掉sayType(int arg)方法,那么輸出的結(jié)果會(huì)變?yōu)椋?/p>
long
這時(shí)發(fā)生了兩次類型轉(zhuǎn)換,'a'轉(zhuǎn)型為整數(shù)97之后,進(jìn)一步轉(zhuǎn)型為長(zhǎng)整數(shù)97L,匹配參數(shù)類型為long的重載。雖然上面代碼中沒有加入其他類型如float、double等的重載,在實(shí)際上自動(dòng)轉(zhuǎn)型還能繼續(xù)發(fā)生多次,按照char>int>long>float>double的順序進(jìn)行匹配,但是不會(huì)匹配到byte和short類型的重載,因?yàn)閏har到byte和short的轉(zhuǎn)型是不安全的。我們繼續(xù)注釋掉sayType(long arg)方法,那么輸出的結(jié)果變?yōu)椋?/p>
Character
這時(shí)發(fā)生了一次自動(dòng)裝箱,'a'被包裝為它的封裝類型java.lang.Character,所以匹配到了參數(shù)類型為Character的重載,繼續(xù)注釋掉sayType(Character arg)方法,那么輸出的結(jié)果會(huì)變?yōu)椋?/p>
Serializable
這個(gè)輸出可能會(huì)讓人感到疑惑,一個(gè)字符或數(shù)字與序列化有什么關(guān)系呢?出現(xiàn)Serializable是因?yàn)閖ava.lang.Serializable是java.lang.Character類實(shí)現(xiàn)的一個(gè)接口,當(dāng)自動(dòng)裝箱之后發(fā)現(xiàn)還是找不到裝箱類,但是找到了裝箱類所實(shí)現(xiàn)的接口類型,所以緊接著又發(fā)生了一次自動(dòng)轉(zhuǎn)型。char可以轉(zhuǎn)型為int,但是Character是絕對(duì)不會(huì)轉(zhuǎn)型為Integer的,它只能安全地轉(zhuǎn)型為它實(shí)現(xiàn)的借口或者父類。Character還實(shí)現(xiàn)了另外一個(gè)接口java.lang.Compara<Character>,如果同時(shí)出現(xiàn)兩個(gè)參數(shù)分別是Serializable和Compara<Character>的重載方法,那它們?cè)诖藭r(shí)的優(yōu)先級(jí)是一樣的。編譯器無(wú)法確定要自動(dòng)轉(zhuǎn)型為哪種類型,會(huì)提示“類型模糊”(Type Ambiguous),并拒絕編譯。讓我們繼續(xù)注釋掉sayType(Serializable arg)方法,輸出結(jié)果會(huì)變?yōu)椋?/p>
Object
這時(shí)是char裝箱后轉(zhuǎn)型為父類了,如果有多個(gè)父類,那么繼承關(guān)系從下往上搜索,越往上層優(yōu)先級(jí)越低。即便方法調(diào)用傳入?yún)?shù)值null時(shí),這個(gè)規(guī)則仍然適用。繼續(xù)把sayType(Object arg)方法注釋掉,結(jié)果會(huì)變?yōu)椋?/p>
char...
此時(shí)就剩下這一個(gè)方法了,可見變長(zhǎng)參數(shù)的重載優(yōu)先級(jí)是最低的。
補(bǔ)充
上面例子演示了Java重載方法優(yōu)先匹配級(jí)別,這也屬于java編譯期間選擇靜態(tài)分配目標(biāo)。這個(gè)例子是很極端的例子,除了作為面試題來(lái)為難應(yīng)聘者之外在實(shí)際工作中幾乎不存在任何價(jià)值
到此這篇關(guān)于Java重載方法匹配優(yōu)先級(jí)的實(shí)現(xiàn)那示例的文章就介紹到這了,更多相關(guān)Java重載方法匹配優(yōu)先級(jí)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
一文帶你搞懂Spring?AI核心接口,輕松對(duì)接所有大模型
Spring?AI簡(jiǎn)單說(shuō)就是?Spring?官方為?Java?開發(fā)者打造的?AI?應(yīng)用開發(fā)框架,本文將從頂層?ChatClient?到底層?Model,逐層拆解?Spring?AI?的核心接口設(shè)計(jì),幫你徹底理清這套萬(wàn)能轉(zhuǎn)接頭的工作原理2026-05-05
springboot集成mybatis?plus和dynamic-datasource注意事項(xiàng)說(shuō)明
這篇文章主要介紹了springboot集成mybatis?plus和dynamic-datasource注意事項(xiàng)說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01
SpringMVC Restful api接口實(shí)現(xiàn)的代碼
本篇文章主要介紹了SpringMVC Restful api接口實(shí)現(xiàn)的代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09
Java volatile的適用場(chǎng)景實(shí)例詳解
在本文里我們給大家整理了一篇關(guān)于Java volatile的適用場(chǎng)景實(shí)例內(nèi)容和知識(shí)點(diǎn),需要的朋友們可以學(xué)習(xí)下。2019-08-08
圖文講解IDEA中根據(jù)數(shù)據(jù)庫(kù)自動(dòng)生成實(shí)體類
這篇文章主要以圖文講解IDEA中根據(jù)數(shù)據(jù)庫(kù)自動(dòng)生成實(shí)體類,本文主要以Mysql數(shù)據(jù)庫(kù)為例,應(yīng)該會(huì)對(duì)大家有所幫助,如果有錯(cuò)誤的地方,還望指正2023-03-03
關(guān)于SpringBoot創(chuàng)建存儲(chǔ)令牌的媒介類和過(guò)濾器的問(wèn)題
這篇文章主要介紹了SpringBoot創(chuàng)建存儲(chǔ)令牌的媒介類和過(guò)濾器的問(wèn)題,需要在配置文件中,添加JWT需要的密匙,過(guò)期時(shí)間和緩存過(guò)期時(shí)間,具體實(shí)例代碼參考下本文2021-09-09

