Java方法重載和重寫原理區(qū)別解析
java中的方法重載和方法重寫有很多區(qū)別。 下面給出了方法重載和方法覆蓋之間的差異列表:
編號 | 方法重載 | 方法重寫 |
---|---|---|
1 | 方法重載用于提高程序的可讀性。 | 方法重寫用于提供已經(jīng)由其超類提供的方法的特定實現(xiàn)。 |
2 | 方法重載在類內(nèi)執(zhí)行。 | 方法重寫發(fā)生在具有IS-A(繼承)關(guān)系的兩個類中。 |
3 | 在方法重載的情況下,參數(shù)必須不同。 | 在方法重寫的情況下,參數(shù)必須相同。 |
4 | 方法重載是編譯時多態(tài)性的例子。 | 方法重寫/覆蓋是運行時多態(tài)性的例子。 |
5 | 在java中,方法重載不能僅通過改變方法的返回類型來執(zhí)行。方法重載中的返回類型可以相同或不同。 但是必須更改參數(shù)類型。 | 在方法重寫/覆蓋中返回類型必須相同或協(xié)變。 |
Java方法重載示例
class OverloadingExample { static int add(int a, int b) { return a + b; } static int add(int a, int b, int c) { return a + b + c; } }
Java方法覆蓋示例
class Animal { void eat() { System.out.println("eating..."); } } class Dog extends Animal { void eat() { System.out.println("eating bread..."); } }
大家看看上面的代碼,帶著疑問接著看下面的文章會更有效果
一、方法重寫(0verride)
在Java 程序中,類的繼承關(guān)系可以產(chǎn)生一個子類,子類繼承父類,它具備了父類所有的特征,繼承了父類所有的方法和變量。
子類可以定義新的特征,當(dāng)子類需要修改父類的一些方法進(jìn)行擴(kuò)展,增大功能,程序設(shè)計者常常把這樣一種操作方法稱為重寫,也可以叫覆寫或覆蓋。
所以,所謂方法的重寫是指子類中的方法和父類中繼承的方法有完全相同的返回值類型、方法名、參數(shù)個數(shù)和參數(shù)類型。這樣就可以實現(xiàn)對父類方法的覆蓋。
如果子類將父類的方法重寫了,調(diào)用的時候肯定是調(diào)用被重寫過的子類的方法,但是如果要還要繼續(xù)調(diào)用父類的方法我們該怎么做呢?
此時通過 super 關(guān)鍵字可以實現(xiàn)這個功能。super 關(guān)鍵字可以從子類訪問父類中的內(nèi)容,如果要訪問被重寫過的方法,使用“super.(參數(shù)列表)” 的形式調(diào)用即可。
當(dāng)然,如果要使用 super 關(guān)鍵字不一定非要在方法重寫后使用,也可以明確的表示某個方法是從父類中繼承而來的。使用 super 只是更加明確的說,要從父類中查找,就不在子類中查找了。
重寫有以下規(guī)則
(1).父方方法的參數(shù)列表必須完全與被子類重寫的方法的參數(shù)列表相同,否則不能稱其為重寫而是重載。
(2).父類返回的類型必須與被子類重寫的方法的參數(shù)列表相同,否則不能稱其為重寫而是重載。
(3).Java 中規(guī)定,被子類重寫的方法不能擁有比父類方法更加樣額的訪問權(quán)限。
編寫過Java程序的人應(yīng)該都知道,父類的中方法并不是在任何情況下都可以重寫的,當(dāng)父類中的方法訪問權(quán)限修飾符為 private時,該方法只能被自己的類訪問,不能被外部訪問,在子類是不能被重寫的。如果定義父類的方法為 public,在子類定義為private 程序運行就會出錯。
(4).由于父類的訪問權(quán)限修飾符限制一定要大于被子類重寫的方法的訪問權(quán)限修飾符,而 private 權(quán)限最小,所以如果某一個方法在父類的訪問權(quán)限是 private 時,那么就不能再子類中對其進(jìn)行重寫。如果重寫定義,也只是定義了一個新的方法,不會達(dá)到重寫的效果。
(5).在繼承過程中如果父類當(dāng)中的方法拋出異常,那么在子類中重寫父類的該方法時,也要拋出異常。而且拋出的異常不能多于父類中拋出的異常(可以等于父類中拋出的異常)。換句話說,重寫方法一定不能拋出新的檢查異常,或者比被重寫方法聲明更加寬泛的檢查異常。
例如:父類的一個方法申明了一個檢查異常 IOException ,在重寫這個方法時就不能拋出 Exception,只能拋出 IOException的子類異常,可以拋出非檢查異常。同樣的道理,如果子類創(chuàng)建了一個成員變量,而該變量和父類中一個變量名稱相同,稱作變量重寫或者屬性覆蓋(這個概念一般很少人研究,意義不大)。
二、方法重載(ordeloading)
概念:所謂的方法重載是指在一個類中,多個方法的方法名相同,但是參數(shù)列表不同。參數(shù)列表不同指的是參數(shù)個數(shù)、參數(shù)類型或者參數(shù)的順序不同。
方法重載是讓類以統(tǒng)一的方式處理不同類型數(shù)據(jù)的一種手段。調(diào)用方法時通過傳遞給它們的不同個數(shù)和參數(shù)來決定具體使用哪個方法,這就是Java中的多態(tài)。
在方法重載時,方法之間需要存在一定的聯(lián)系,因為這樣可以提高程序的可讀性,一般只重載功能相似的方法。
我們可以定義一些名稱相同的方法,再通過定義不同的參數(shù)來區(qū)分方法,然后在調(diào)用時,Java 虛擬機就會根據(jù)不同的參數(shù)列表來選擇合適的方法執(zhí)行。也就是說,當(dāng)一個重載的方法被調(diào)用時,Java 用參數(shù)類型或者個數(shù)來決定世界調(diào)用的重載方法。因此,每個重載方法的參數(shù)的類型或者個數(shù)必須不同。
雖然每個重載的方法可以有不同的返回類型,但返回類型并不足以區(qū)分所使用的是哪個方法。
當(dāng)Java 調(diào)用一個重載方法時,參數(shù)與調(diào)用參數(shù)匹配的方法被執(zhí)行。在使用重載要注意以下幾點:
(1).在使用重載時只能通過不同的參數(shù)列表,必須具有不同的參數(shù)列表
(2).不能通過訪問權(quán)限、返回類型、拋出的異常進(jìn)行重載
(3).方法的異常類型和數(shù)目不會對重載造成影響。
(4).可以有不同的返回值類型,只要參數(shù)列表不同就可以
(5).可以有不同的訪問修飾符
(6).可以拋出不同的異常
三、方法重寫和重載的區(qū)別
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot中動態(tài)數(shù)據(jù)源配置與使用詳解
在現(xiàn)代應(yīng)用中,處理多數(shù)據(jù)源是常見的需求,在 Spring Boot 中,這樣的需求可以通過動態(tài)數(shù)據(jù)源來輕松實現(xiàn),本篇博客將詳細(xì)介紹如何在 Spring Boot 中配置和使用動態(tài)數(shù)據(jù)源,并演示如何切換到指定的數(shù)據(jù)源,需要的朋友可以參考下2024-10-10Java定時任務(wù)ScheduledThreadPoolExecutor示例詳解
這篇文章主要介紹了Java定時任務(wù)ScheduledThreadPoolExecutor示例詳解,這里使用scheduleAtFixedRate方法安排一個任務(wù),該任務(wù)是一個 Runnable 匿名類,其run方法中調(diào)用了new LoginViewTimeTask().loginStatisticsHandle()方法,需要的朋友可以參考下2023-11-11SpringBoot的配置文件application.yml及加載順序詳解
這篇文章主要介紹了SpringBoot的配置文件application.yml及加載順序,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07SpringCloud Feign多參數(shù)傳遞及需要注意的問題
這篇文章主要介紹了SpringCloud Feign多參數(shù)傳遞及需要注意的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03Spring Boot 各種回滾操作實戰(zhàn)教程(自動回滾、手動回滾、部分回滾)
這篇文章主要介紹了Spring Boot 各種回滾操作實戰(zhàn)教程(自動回滾、手動回滾、部分回滾),本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-07-07springboot項目打包發(fā)布部署的過程及jar和war的區(qū)別
Spring Boot使用了內(nèi)嵌容器,因此它的部署方式也變得非常簡單靈活,可以將Spring Boot項目打包成JAR包來獨立運行,Spring Boot項目既可以生成WAR包發(fā)布,也可以生成JAR包發(fā)布,那么它們有什么區(qū)別呢2022-11-11