詳解Java中方法重寫和方法重載的6個區(qū)別
方法重寫(Override)和方法重載(Overload)都是面向?qū)ο缶幊讨?,多態(tài)特性的不同體現(xiàn),但二者本身并無關聯(lián),它們的區(qū)別猶如馬德華之于劉德華的區(qū)別,除了名字長得像之外,其他的都不像。
接下來咱們就來扒一下二者的具體區(qū)別。
1.方法重寫
方法重寫(Override)是一種語言特性,它是多態(tài)的具體表現(xiàn),它允許子類重新定義父類中已有的方法,且子類中的方法名和參數(shù)類型及個數(shù)都必須與父類保持一致,這就是方法重寫。
1.1 基本用法
方法重寫的基本用法如下:
/**
* 父類中有一個 method 方法
*/
class Father {
public void method(String name) {
System.out.println("Father:" + name);
}
}
/**
* 子類中重寫了父類的 method 方法
*/
class Son extends Father {
@Override
public void method(String name) {
// 子類中重新定義了打印的行為,不再是 Father:XXX,而是 Son:XXX
System.out.println("Son:" + name);
}
}1.2 使用場景
方法重寫在 Java 中應用的場景有很多,其中比較經(jīng)典的是 Object 類中的 equals 方法。 Object 是所有類的父類,equals 方法在 Object 類中的實現(xiàn)源碼如下:

從上述源碼可以看出,Object 類中的 equals 是用來比較兩個對象的引用地址是否相同的。 但對于字符串來說,它是被 final 修飾的,所以每次創(chuàng)建的字符串引用地址都不同,那這時比較引用地址就沒意義了,所以 String 類必須重寫父類 Object 中的 equals 方法,具體源碼如下:

通過上述代碼我們可以看出,String 中的 equals 方法,已經(jīng)不是比較兩個字符串的引用地址是否相同了,而是判斷兩個字符串的值是否相同。
1.3 注意事項
在方法重寫時需要注意的事項有以下 5 個:
- 注意事項 1:子類方法的權(quán)限控制符不能變小,也就是如果父類方法的權(quán)限控制符是 protected,那么子類的方法權(quán)限控制符只能是 protected 或 public;
- 注意事項 2:子類方法返回的類型只能變小,也就是說如果父類方法返回的是 Number 類型,那么子類方法只能返回 Number 類型或 Number 類的子類 Long 類型,而不能返回 Number 類型的父類類型 Object;
- 注意事項 3:子類拋出異常的類型只能變??;
- 注意事項 4:子類方法名必須和父類方法名保持一致;
- 注意事項 5:子類方法的參數(shù)類型和個數(shù)必須和父類保持一致。
2.方法重載
方法重載是指在同一個類中,定義了多個同名方法,但同名方法的參數(shù)類型或參數(shù)個數(shù)不同就是方法重載。
2.1 基本使用
以下 4 個 method 方法就是方法重載:
public class OverloadExample {
public static void method() {
// doSomething
}
public static void method(String name) {
// doSomething
}
public static void method(Integer id) {
// doSomething
}
public static void method(Integer id, String name) {
// doSomething
}
}2.2 使用場景
方法重載的經(jīng)典使用場景是 String 類型的 valueOf 方法,valueOf 方法重載有 9 種實現(xiàn),如下圖所示:

它可以將數(shù)組、對象和基礎數(shù)據(jù)類型轉(zhuǎn)換成字符串類型。
2.3 注意事項
方法重載的優(yōu)先匹配原則有以下 5 個:
- 第 1 匹配原則:優(yōu)先匹配相同數(shù)據(jù)類型,方法重載會優(yōu)先調(diào)用和方法參數(shù)類型一模一樣的方法,比如只有一個 String 類型的參數(shù)調(diào)用,會優(yōu)先匹配只有一個 String 參數(shù)類型的重載方法;
- 第 2 匹配原則:如果是基本數(shù)據(jù)類型,會自動轉(zhuǎn)換成更大的基本數(shù)據(jù)類型進行匹配,比如調(diào)用的參數(shù)是 int 類型,那么會優(yōu)先調(diào)用基本類型 long,而非包裝類型 Integer(這點需要特殊注意,容易出錯)。
- 第 3 匹配原則:自動裝箱和自動拆箱匹配,參數(shù)調(diào)用也會進行自動拆箱和自動裝箱的方法匹配,比如調(diào)用參數(shù)傳遞的是 int 類型,那么它可以匹配到 Integer 類型的重載方法;
- 第 4 匹配原則:會按照繼承路線依次向上匹配父類,如果匹配不到當前類,會嘗試匹配它的父類,或者是父類的父類,依次往上匹配;
- 第 5 匹配原則:可變參數(shù)匹配,如果方法是可選參數(shù)方法,那么它的調(diào)用優(yōu)先級是最低的,在最后階段才會匹配可選參數(shù)方法。
方法重載會按照以上的 5 個原則依次進行匹配,符合規(guī)則的方法會被優(yōu)先調(diào)用。除了以上匹配原則之外,還需要特殊注意一點,不同的返回類型不能作為方法重載的依據(jù),也就是不同的返回值類型不算方法重載
3.方法重寫 VS 方法重載
方法重寫和方法重載的具體不同,主要體現(xiàn)在以下 6 個方面:
| 區(qū)別 | 方法重寫 | 方法重載 |
|---|---|---|
| 方法關系 | 描述的是父類和子類的方法關系 | 描述的是同一個類中多個同名方法的方法關系 |
| Override 關鍵字 | 需要使用 @Override 關鍵字修飾 | 不需要 |
| 參數(shù)類型和參數(shù)個數(shù) | 不能修改 | 必須修改 |
| 返回類型 | 只能變小或相同,不能變大 | 可修改 |
| 拋出異常 | 只能變小或刪除,不能拋出新的或者更大的異常 | 可修改 |
| 權(quán)限控制符 | 只能變大,不能變小 | 可修改 |
總結(jié)
方法重寫(Override)和方法重載(Overload)都是面向?qū)ο缶幊讨?,多態(tài)特性的不同體現(xiàn),方法重寫描述的是父類和子類的方法關系,而方法重載描述的是同一個類中多個同名方法的方法關系。除此之外方法重寫和方法重載還有:Override 關鍵字、參數(shù)類型和參數(shù)個數(shù)、返回類型、拋出異常和權(quán)限控制符等不同點。?
到此這篇關于詳解Java中方法重寫和方法重載的6個區(qū)別的文章就介紹到這了,更多相關Java 方法重寫和方法重載內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Spring?Boot和Vue前后端分離項目架構(gòu)的全過程
前后端分離是目前互聯(lián)網(wǎng)開發(fā)中比較廣泛使用的開發(fā)模式,主要是將前端和后端的項目業(yè)務進行分離,下面這篇文章主要給大家介紹了關于Spring?Boot和Vue前后端分離項目架構(gòu)的相關資料,需要的朋友可以參考下2022-04-04
java Unicode和UTF-8之間轉(zhuǎn)換實例
這篇文章主要介紹了java Unicode和UTF-8之間轉(zhuǎn)換實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09
一篇文章帶你入門Springboot整合微信登錄與微信支付(附源碼)
微信支付是騰訊公司的支付業(yè)務品牌,微信支付商戶平臺支持線下場所、公眾號、小程序、PC網(wǎng)站、APP、企業(yè)微信等經(jīng)營場景快速接入微信支付。這里一篇文章帶你入門!2021-06-06
SpringBoot中配置雙數(shù)據(jù)源的實現(xiàn)示例
在許多應用程序中,可能會遇到需要連接多個數(shù)據(jù)庫的情況,本文主要介紹了SpringBoot中配置雙數(shù)據(jù)源的實現(xiàn)示例,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-08-08
java實現(xiàn)消息隊列的兩種方式(小結(jié))
本文主要介紹了兩種java實現(xiàn)消息隊列的方式,利用Spring消息模板發(fā)送消息和Apache ActiveMQ官方實例發(fā)送消息,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2018-12-12

