Java重載和重寫及其區(qū)別

本文僅作記錄和學(xué)習(xí)所用!
轉(zhuǎn)自 Java重載和重寫的區(qū)別——大_心

方法重寫(0verride)

在Java 程序中,類的繼承關(guān)系可以產(chǎn)生一個(gè)子類,子類繼承父類,它具備了父類所有的特征,繼承了父類所有的方法和變量。

子類可以定義新的特征,當(dāng)子類需要修改父類的一些方法進(jìn)行擴(kuò)展,增大功能,程序設(shè)計(jì)者常常把這樣一種操作方法稱為重寫,也可以叫覆寫或覆蓋。

所以,所謂方法的重寫是指子類中的方法和父類中繼承的方法有完全相同的返回值類型、方法名、參數(shù)個(gè)數(shù)和參數(shù)類型。這樣就可以實(shí)現(xiàn)對(duì)父類方法的覆蓋。

如果子類將父類的方法重寫了,調(diào)用的時(shí)候肯定是調(diào)用被重寫過的子類的方法,但是如果要還要繼續(xù)調(diào)用父類的方法我們?cè)撛趺醋瞿兀?/p>

此時(shí)通過 super 關(guān)鍵字可以實(shí)現(xiàn)這個(gè)功能。super 關(guān)鍵字可以從子類訪問父類中的內(nèi)容,如果要訪問被重寫過的方法,使用“super.(參數(shù)列表)” 的形式調(diào)用即可。

當(dāng)然,如果要使用 super 關(guān)鍵字不一定非要在方法重寫后使用,也可以明確的表示某個(gè)方法是從父類中繼承而來的。使用 super 只是更加明確的說,要從父類中查找,就不在子類中查找了。

重寫有以下規(guī)則:

(1).父方方法的參數(shù)列表必須完全與被子類重寫的方法的參數(shù)列表相同,否則不能稱其為重寫而是重載。

(2).父類返回的類型必須與被子類重寫的方法的參數(shù)列表相同,否則不能稱其為重寫而是重載。

(3).Java 中規(guī)定,被子類重寫的方法不能擁有比父類方法更加樣額的訪問權(quán)限。

編寫過Java程序的人應(yīng)該都知道,父類的中方法并不是在任何情況下都可以重寫的,當(dāng)父類中的方法訪問權(quán)限修飾符為 private時(shí),該方法只能被自己的類訪問,不能被外部訪問,在子類是不能被重寫的。如果定義父類的方法為 public,在子類定義為private 程序運(yùn)行就會(huì)出錯(cuò)。

(4).由于父類的訪問權(quán)限修飾符限制一定要大于被子類重寫的方法的訪問權(quán)限修飾符,而 private 權(quán)限最小,所以如果某一個(gè)方法在父類的訪問權(quán)限是 private 時(shí),那么就不能再子類中對(duì)其進(jìn)行重寫。如果重寫定義,也只是定義了一個(gè)新的方法,不會(huì)達(dá)到重寫的效果。

(5).在繼承過程中如果父類當(dāng)中的方法拋出異常,那么在子類中重寫父類的該方法時(shí),也要拋出異常。而且拋出的異常不能多于父類中拋出的異常(可以等于父類中拋出的異常)。換句話說,重寫方法一定不能拋出新的檢查異常,或者比被重寫方法聲明更加寬泛的檢查異常。

例如:父類的一個(gè)方法申明了一個(gè)檢查異常 IOException ,在重寫這個(gè)方法時(shí)就不能拋出 Exception,只能拋出 IOException的子類異常,可以拋出非檢查異常。同樣的道理,如果子類創(chuàng)建了一個(gè)成員變量,而該變量和父類中一個(gè)變量名稱相同,稱作變量重寫或者屬性覆蓋(這個(gè)概念一般很少人研究,意義不大)。

方法重載(ordeloading)

方法重載是指在一個(gè)類中,多個(gè)方法的方法名相同,但是參數(shù)列表不同。參數(shù)列表不同指的是參數(shù)個(gè)數(shù)、參數(shù)類型或者參數(shù)的順序不同。

方法重載是讓類以統(tǒng)一的方式處理不同類型數(shù)據(jù)的一種手段。調(diào)用方法時(shí)通過傳遞給它們的不同個(gè)數(shù)和參數(shù)來決定具體使用哪個(gè)方法,這就是Java中的多態(tài)。

在方法重載時(shí),方法之間需要存在一定的聯(lián)系,因?yàn)檫@樣可以提高程序的可讀性,一般只重載功能相似的方法。

我們可以定義一些名稱相同的方法,再通過定義不同的參數(shù)來區(qū)分方法,然后在調(diào)用時(shí),Java 虛擬機(jī)就會(huì)根據(jù)不同的參數(shù)列表來選擇合適的方法執(zhí)行。也就是說,當(dāng)一個(gè)重載的方法被調(diào)用時(shí),Java 用參數(shù)類型或者個(gè)數(shù)來決定世界調(diào)用的重載方法。因此,每個(gè)重載方法的參數(shù)的類型或者個(gè)數(shù)必須不同。

雖然每個(gè)重載的方法可以有不同的返回類型,但返回類型并不足以區(qū)分所使用的是哪個(gè)方法。

當(dāng)Java 調(diào)用一個(gè)重載方法時(shí),參數(shù)與調(diào)用參數(shù)匹配的方法被執(zhí)行

使用重載要注意以下幾點(diǎn):

(1).在使用重載時(shí)只能通過不同的參數(shù)列表,必須具有不同的參數(shù)列表

(2).不能通過訪問權(quán)限、返回類型、拋出的異常進(jìn)行重載

(3).方法的異常類型和數(shù)目不會(huì)對(duì)重載造成影響。

(4).可以有不同的返回值類型,只要參數(shù)列表不同就可以

(5).可以有不同的訪問修飾符

(6).可以拋出不同的異常

方法重寫和重載的區(qū)別

區(qū)別 重載 重寫
英文 overload override
參數(shù)列表 必須修改 一定不能修改
返回類型 可以修改 一定不能修改
異常 可以修改 可以減少或刪除,一定不能拋出新的或者更廣的異常
訪問 可以修改 一定不能做更嚴(yán)格的限制(可以降低限制)

總結(jié)

方法的重寫(Overriding)和重載(Overloading)是java多態(tài)性的不同表現(xiàn),重寫是父類與子類之間多態(tài)性的一種表現(xiàn),重載可以理解成多態(tài)的具體表現(xiàn)形式。

  • (1)方法重載是一個(gè)類中定義了多個(gè)方法名相同,而他們的參數(shù)的數(shù)量不同或數(shù)量相同而類型和次序不同,則稱為方法的重載(Overloading)。

  • (2)方法重寫是在子類存在方法與父類的方法的名字相同,而且參數(shù)的個(gè)數(shù)與類型一樣,返回值也一樣的方法,就稱為重寫(Overriding)。

  • (3)方法重載是一個(gè)類的多態(tài)性表現(xiàn),而方法重寫是子類與父類的一種多態(tài)性表現(xiàn)。


    重寫(Overriding)和重載(Overloading)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Java 方法重載和方法重寫的區(qū)別有哪些? 解析:先明白重載和重寫的定義。 一、方法重寫(0verride) 在J...
    南城刀閱讀 773評(píng)論 0 1
  • 重寫和重載區(qū)別 重寫方法的規(guī)則如下: 參數(shù)列表:必須與被重寫方法的參數(shù)列表完全匹配。 返回類型:必須與超類中被重寫...
    指尖的跳躍閱讀 861評(píng)論 0 2
  • 1、方法的重寫(Override)(方法覆蓋) (1)重寫介紹: java SE5增加@Override注解,并不...
    Hughman閱讀 1,505評(píng)論 0 3
  • Java基礎(chǔ)面試 Java基礎(chǔ)面試... 1 1. Java基礎(chǔ)知識(shí)... 5 1.1. Java源程序的擴(kuò)展名是...
    來著何人閱讀 1,292評(píng)論 0 1
  • 目前為止,講述“寫作”的書嚴(yán)格來說看了2本多吧,今天來說說孩童眼光看世界。 所謂孩童眼光看世界,其實(shí)是說,從隨處可...
    海邊的藍(lán)兔子閱讀 323評(píng)論 0 3

友情鏈接更多精彩內(nèi)容