Java基礎(chǔ)之重載(Overload)與重寫(Override)詳解
一、重載(Overload)
重載是在一個(gè)類里面,方法名字相同,而參數(shù)不同。返回類型可以相同也可以不同。
每個(gè)重載的方法(或者構(gòu)造函數(shù))都必須有一個(gè)獨(dú)一無(wú)二的參數(shù)類型列表。
最常用的地方就是構(gòu)造器的重載。
重載的好處:
1.不用為了對(duì)不同的參數(shù)類型或參數(shù)個(gè)數(shù),而寫多個(gè)函數(shù)。
2.多個(gè)函數(shù)用同一個(gè)名字,但參數(shù)表,即參數(shù)的個(gè)數(shù)或(和)數(shù)據(jù)類型可以不同,調(diào)用的時(shí)候,雖然方法名字相同,但根據(jù)參數(shù)表可以自動(dòng)調(diào)用對(duì)應(yīng)的函數(shù)。
3.重載的最直接作用是方便了程序員可以根據(jù)不同的參數(shù)個(gè)數(shù),順序,類型,自動(dòng)匹配方法,減少寫過(guò)個(gè)函數(shù)名或方法名的重復(fù)步驟。
4.增加代碼可讀性,執(zhí)行同樣功能但具有不同參數(shù)類型的方法應(yīng)該使用同樣的名字。
重載規(guī)則:
1.被重載的方法必須改變參數(shù)列表(參數(shù)個(gè)數(shù)或類型不一樣)。
2.被重載的方法可以改變返回類型。
3.被重載的方法可以改變?cè)L問(wèn)修飾符。
4.被重載的方法可以聲明新的或更廣的檢查異常。
5.方法能夠在同一個(gè)類中或者在一個(gè)子類中被重載。
6.無(wú)法以返回值類型作為重載函數(shù)的區(qū)分標(biāo)準(zhǔn)。
歧義調(diào)用:
public class TestMethodOverload { public static double max(double num1,double num2) { if(num1 > num2) return num1; else return num2; } public static int max(int num1,int num2) { if(num1 > num2) return num1; else return num2; } public static void main(String[] args) { System.out.println("The max of 3 and 4 is "+max(3,4)); //調(diào)用max(int num1,int num2)方法 System.out.println("The max of 3.0 and 4.0 is "+max(3.0,4.0)); //調(diào)用max(double num1,double num2)方法 System.out.println("The max of 3 and 4.0 is "+max(3,4.0)); //調(diào)用max(double num1,double num2)方法,調(diào)用方法時(shí)實(shí)參值3會(huì)轉(zhuǎn)換為double型 } }
調(diào)用max(3,4)時(shí)為什么不用max(double num1,double num2)方法呢?
調(diào)用方法時(shí),有時(shí)會(huì)有一個(gè)或多個(gè)可能的匹配,java編譯器會(huì)尋找最精確匹配的方法。方法max (int num1,int num2)比max(double num1,double num2)更精確。
有時(shí)調(diào)用一個(gè)方法時(shí),會(huì)有兩個(gè)或更多可能的匹配,但是編譯器無(wú)法判斷哪個(gè)是最精確的匹配。這稱為歧義調(diào)用(ambiguous invocation)。歧義調(diào)用會(huì)產(chǎn)生一個(gè)編譯錯(cuò)誤。
public class TestMethodOverload { public static double max(double num1,int num2) { if(num1 > num2) return num1; else return num2; } public static double max(int num1,double num2) { if(num1 > num2) return num1; else return num2; } public static void main(String[] args) { System.out.println("The max of 3 and 4 is "+max(3,4)); //無(wú)法判斷用哪個(gè)方法,編譯錯(cuò)誤 } }
二、重寫(Override)
重寫是子類對(duì)父類的允許訪問(wèn)的方法的實(shí)現(xiàn)過(guò)程進(jìn)行重新編寫, 返回值和形參都不能改變。
重寫的好處在于子類可以根據(jù)需要,定義特定于自己的行為。 也就是說(shuō)子類能夠根據(jù)需要實(shí)現(xiàn)父類的方法。
重寫方法不能拋出新的檢查異?;蛘弑缺恢貙懛椒ㄉ昝鞲訉挿旱漠惓?。
class People{ public void speak(){ Systom.out.println("可以說(shuō)話"); } } class ChinaPeople extends People{ public void speak(){ System.out.println("可以說(shuō)中文"); } public void color(){ System.out.println("皮膚為黃色"); } } public class Test{ public static void main(String[] args){ People a = new People();//People對(duì)象 People b = new ChinaPeople();//ChinaPeople對(duì)象 a.speak();//執(zhí)行People類的方法 b.speak();//執(zhí)行ChinaPeople類的方法 b.color(); } }
方法的重寫規(guī)則:
1.參數(shù)列表與被重寫方法的參數(shù)列表必須完全相同。
2.返回類型與被重寫方法的返回類型可以不相同,但是必須是父類返回值的派生類。
3.訪問(wèn)權(quán)限不能比父類中被重寫的方法的訪問(wèn)權(quán)限更低。
4.父類的成員方法只能被它的子類重寫。
5.聲明為 final 的方法不能被重寫。
6.聲明為 static 的方法不能被重寫,但是能夠被再次聲明??捎?父類名.靜態(tài)方法名 來(lái)調(diào)用父類的static方法。
7.子類和父類在同一個(gè)包中,那么子類可以重寫父類除了聲明為 private 和 final 的所有方法。
8.子類和父類不在同一個(gè)包中,那么子類只能夠重寫父類的聲明為 public 和 protected 的非 final 方法。
9.重寫的方法能夠拋出任何非強(qiáng)制異常,無(wú)論被重寫的方法是否拋出異常。但是,重寫的方法不能拋出新的強(qiáng)制性異常,或者比被重寫方法聲明的更廣泛的強(qiáng)制性異常,反之則可以。(如果想在子類中拋出某強(qiáng)制性異常(編譯型異常),父類中必須拋出這個(gè)異?;蚋鼜V的異常)
10.構(gòu)造方法不能被重寫。
11.如果不能繼承一個(gè)類,則不能重寫該類的方法。
super關(guān)鍵字:
當(dāng)需要在子類中調(diào)用父類的被重寫方法時(shí),要使用 super 關(guān)鍵字。
class People{ public void speak(){ Systom.out.println("可以說(shuō)話"); } } class ChinaPeople extends People{ public void speak(){ System.out.println("可以說(shuō)中文"); } } public class Test{ public static void main(String[] args){ People a = new ChinaPeople();//ChinaPeople對(duì)象 super.speak();//執(zhí)行People類的方法 b.speak();//執(zhí)行ChinaPeople類的方法 } }
三、重寫與重載之間的區(qū)別
區(qū)別點(diǎn) | 重載方法 | 重寫方法 |
參數(shù)列表 | 必須修改 | 一定不能修改 |
返回類型 | 可以修改 | 一定不能修改 |
異常 | 可以修改 | 可以減少或刪除,一定不能拋出新的或者更廣的異常 |
訪問(wèn) | 可以修改 | 一定不能做更嚴(yán)格的限制(可以降低限制) |
四、總結(jié)
方法的重寫(Override)和重載(Overload)是java多態(tài)性的不同表現(xiàn),重寫是父類與子類之間多態(tài)性的一種表現(xiàn),重載可以理解成多態(tài)的具體表現(xiàn)形式。
1.方法重載是一個(gè)類中定義了多個(gè)方法名相同,而他們的參數(shù)的數(shù)量不同或數(shù)量相同而類型和次序不同,則稱為方法的重載(Overload)。
2.方法重寫是在子類存在方法與父類的方法的名字相同,而且參數(shù)的個(gè)數(shù)與類型一樣,返回值也一樣的方法,就稱為重寫(Override)。
3.方法重載是一個(gè)類的多態(tài)性表現(xiàn),而方法重寫是子類與父類的一種多態(tài)性表現(xiàn)。
到此這篇關(guān)于Java基礎(chǔ)之重載(Overload)與重寫(Override)詳解的文章就介紹到這了,更多相關(guān)Java重載與重寫內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Springmvc自定義類型轉(zhuǎn)換器實(shí)現(xiàn)步驟
這篇文章主要介紹了Springmvc自定義類型轉(zhuǎn)換器實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08淺談SpringBoot2.4 配置文件加載機(jī)制大變化
這篇文章主要介紹了淺談SpringBoot2.4 配置文件加載機(jī)制大變化,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08SpringBoot時(shí)間格式化的方法小結(jié)
SpringBoot中的時(shí)間格式化通常指的是將Java中的日期時(shí)間類型轉(zhuǎn)換為指定格式的字符串,或者將字符串類型的時(shí)間解析為Java中的日期時(shí)間類型,本文小編將給大家詳細(xì)總結(jié)了SpringBoot時(shí)間格式化的方法,剛興趣的小伙伴跟著小編一起來(lái)看看吧2023-10-10Spring中Bean的創(chuàng)建流程詳細(xì)解讀
這篇文章主要介紹了Spring中Bean的創(chuàng)建流程詳細(xì)解讀,Spring 中創(chuàng)建 Bean ,是通過(guò)調(diào)用 GetBean 方法來(lái)觸發(fā)的,所以,我們會(huì)從這個(gè)方法開(kāi)始,需要的朋友可以參考下2023-10-10Java使用poi導(dǎo)出ppt文件的實(shí)現(xiàn)代碼
Apache POI 是用Java編寫的免費(fèi)開(kāi)源的跨平臺(tái)的 Java API,Apache POI提供API給Java對(duì)Microsoft Office格式檔案讀和寫的功能。本文給大家介紹Java使用poi導(dǎo)出ppt文件的實(shí)現(xiàn)代碼,需要的朋友參考下吧2021-06-06為什么Java開(kāi)發(fā)需要配置環(huán)境變量
這篇文章主要介紹了為什么Java開(kāi)發(fā)需要配置環(huán)境變量,幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下2020-08-08