Java中為什么不同的返回類型不算方法重載_第1頁
Java中為什么不同的返回類型不算方法重載_第2頁
Java中為什么不同的返回類型不算方法重載_第3頁
Java中為什么不同的返回類型不算方法重載_第4頁
Java中為什么不同的返回類型不算方法重載_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第Java中為什么不同的返回類型不算方法重載目錄為什么不同返回類型不算方法重載?方法重載的使用場景方法重載匹配原則匹配原則1:精準(zhǔn)類型匹配匹配原則2:基本類型自動(dòng)轉(zhuǎn)換成更大的基本類型匹配原則3:自動(dòng)裝/拆箱匹配匹配原則4:按照繼承路線依次向上匹配匹配原則5:可變參數(shù)匹配總結(jié)方法重載是指在同一個(gè)類中,定義了多個(gè)同名方法,但每個(gè)方法的參數(shù)類型或者是參數(shù)個(gè)數(shù)不同就是方法重載。比如以下4個(gè)method方法就可以稱之為方法重載,

如下代碼所示:

publicclassOverloadExample{

publicvoidmethod(){

//doSomething

publicvoidmethod(Stringname){

//doSomething

publicvoidmethod(Integerid){

//doSomething

publicvoidmethod(Integerid,Stringname){

//doSomething

}

為什么不同返回類型不算方法重載?

要回答這個(gè)問題,首先要了解一點(diǎn)前置內(nèi)容,方法簽名。方法簽名是由:方法名稱+參數(shù)類型+參數(shù)個(gè)數(shù)組成的一個(gè)唯一值,這個(gè)唯一值就是方法簽名,而JVM(Java虛擬機(jī))就是通過這個(gè)方法簽名來決定調(diào)用哪個(gè)方法的。從方法簽名的組成規(guī)則我們可以看出,方法的返回類型不是方法簽名的組成部分,所以當(dāng)同一個(gè)類中出現(xiàn)了多個(gè)方法名和參數(shù)相同,但返回值類型不同的方法時(shí),JVM就沒辦法通過方法簽名來判斷到底要調(diào)用哪個(gè)方法了,如下圖所示:

那為什么返回類型不能做為方法簽名的一部分呢?原因其實(shí)很簡單,試想一下,如果方法的返回類型也作為方法簽名的一部分,那么當(dāng)程序員寫了一個(gè)代碼去調(diào)用重載的方法時(shí),JVM就不能分辨要調(diào)用哪個(gè)方法了,

如下代碼所示:

publicclassOverloadExample{

publicstaticvoidmain(String[]args){

OverloadExampleexample=newOverloadExample();

example.method("磊哥");//JVM應(yīng)該調(diào)用哪個(gè)方法?

publicintmethod(Stringname){

//doSomething

return666;

publicStringmethod(Stringname){

//doSomething

return"磊哥聊編程";

}

像以上情況,JVM就推斷不出來要調(diào)用哪個(gè)方法了,所以方法的返回類型不能作為方法簽名的一部分。

方法重載的使用場景

方法重載的經(jīng)典使用場景是String類型的valueOf方法,valueOf方法重載有9種實(shí)現(xiàn),

如下圖所示:

它可以將數(shù)組、對(duì)象和基礎(chǔ)數(shù)據(jù)類型轉(zhuǎn)換成字符串類型。

方法重載匹配原則

方法重載的調(diào)用順序是有前后之分的,比如以下代碼:

publicclassOverloadExample{

publicstaticvoidmain(String[]args){

OverloadExampleexample=newOverloadExample();

example.method(12);

publicvoidmethod(intnum){

System.out.println("調(diào)用int方法");

publicvoidmethod(longnum){

System.out.println("調(diào)用long方法");

publicvoidmethod(Integernum){

System.out.println("調(diào)用Integer方法");

publicvoidmethod(Objectnum){

System.out.println("調(diào)用Object方法");

publicvoidmethod(int...num){//可選參數(shù)

System.out.println("調(diào)用int...方法");

}

當(dāng)出現(xiàn)方法重載時(shí),程序要調(diào)用哪個(gè)方法呢?執(zhí)行以上程序的執(zhí)行結(jié)果如下:

因此我們可以得出以下結(jié)論。

匹配原則1:精準(zhǔn)類型匹配

方法重載會(huì)優(yōu)先調(diào)用和方法參數(shù)類型一模一樣的方法,這是第一優(yōu)先匹配原則:精準(zhǔn)類型匹配。

匹配原則2:基本類型自動(dòng)轉(zhuǎn)換成更大的基本類型

接下來我們把精準(zhǔn)匹配方法刪掉,觀察一下第二匹配順序是什么?

實(shí)現(xiàn)代碼如下:

publicclassOverloadExample{

publicstaticvoidmain(String[]args){

OverloadExampleexample=newOverloadExample();

example.method(12);

publicvoidmethod(longnum){

System.out.println("調(diào)用long方法");

publicvoidmethod(Integernum){

System.out.println("調(diào)用Integer方法");

publicvoidmethod(Objectnum){

System.out.println("調(diào)用Object方法");

publicvoidmethod(int...num){//可選參數(shù)

System.out.println("調(diào)用int...方法");

}

以上程序的執(zhí)行結(jié)果如下圖所示:

因此我們可以得出結(jié)論:如果是基本數(shù)據(jù)類型,那么方法重載調(diào)用的第二匹配原則是自動(dòng)轉(zhuǎn)換成更大的基本數(shù)據(jù)類型。

匹配原則3:自動(dòng)裝/拆箱匹配

接下來將第二匹配原則中的long方法也刪除掉,實(shí)現(xiàn)代碼如下:

publicclassOverloadExample{

publicstaticvoidmain(String[]args){

OverloadExampleexample=newOverloadExample();

example.method(12);

publicvoidmethod(Integernum){

System.out.println("調(diào)用Integer方法");

publicvoidmethod(Objectnum){

System.out.println("調(diào)用Object方法");

publicvoidmethod(int...num){//可選參數(shù)

System.out.println("調(diào)用int...方法");

}

以上程序的執(zhí)行結(jié)果如下圖所示:

從上述執(zhí)行結(jié)果可以看出,方法重載的第三匹配原則是,匹配自動(dòng)裝箱或拆箱的數(shù)據(jù)類型。

匹配原則4:按照繼承路線依次向上匹配

此時(shí)將第三匹配原則中的Integer方法刪除,剩下代碼如下:

publicclassOverloadExample{

publicstaticvoidmain(String[]args){

OverloadExampleexample=newOverloadExample();

example.method(12);

publicvoidmethod(Objectnum){

System.out.println("調(diào)用Object方法");

publicvoidmethod(int...num){//可選參數(shù)

System.out.println("調(diào)用int...方法");

}

以上程序的執(zhí)行結(jié)果如下圖所示:

從上述執(zhí)行結(jié)果可以看出,方法重載的第四匹配原則是,依次向上匹配父類的方法調(diào)用。

匹配原則5:可變參數(shù)匹配

最后將代碼中的方法刪除的只剩一個(gè)可選參數(shù),實(shí)現(xiàn)代碼如下:

publicclassOverloadExample{

publicstaticvoidmain(String[]args){

OverloadExampleexample=newOverloadExample();

example.method(12);

publicvoidmethod(int...num){//可選參數(shù)

System.out.println("調(diào)用int...方法");

}

以上程序的執(zhí)行結(jié)果如下圖所示:

從上述執(zhí)行結(jié)果可以看出,方法重載的第五匹配原

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論