Java構(gòu)造器方法深入理解
重載
1.構(gòu)造器的重載
因為構(gòu)造器的名字必須與類名相同,所以同一個類的所有構(gòu)造器名肯定相同,構(gòu)成重載;為了讓系統(tǒng)能區(qū)分不同的構(gòu)造器,多個構(gòu)造器的參數(shù)列表必須不同。
class Person{ int age; String name; public Person(){ } public Person(int age){ this.age = age; } public Person(int age,String name){ this(age); this.name = name; } }
2.方法的重載(overload)
1.定義:在同一個類中,允許存在一個以上的同名方法,只要他們的參數(shù)個數(shù)或者參數(shù)類型不同即可。
兩同一不同”:同一個類、相同方法名
參數(shù)列表不同:參數(shù)個數(shù)不同,參數(shù)類型不同
2.舉例:
Arrays類中重載的sort() / binarySearch()
3.判斷是否重載:
跟方法的權(quán)限修飾符、返回值類型、形參變量名、方法體都沒有關(guān)系!
class Person{ public void getSum(int i,int j){//A System.out.println("憨憨"); } public void getSum(double d1,double d2){//B } public void getSum(String s,int i){//形參先后順序不同,也構(gòu)成重載//C } public void getSum(int i,String s){//D } public void getSum(int i,int j){//與方法體無關(guān)?。。?! return 0; } public void getSum(int m,int n){//與參數(shù)名無關(guān)!?。?! } private void getSum(int i,int j){//與權(quán)限修飾符大小無關(guān)!?。?! } }
4.在通過對象調(diào)用方法時,如何確定某一個指定的方法 :
方法名------>參數(shù)列表
重寫
為什么要重寫:父類的功能無法滿足子類的需求
方法重寫的前提:必須要存在繼承的關(guān)系!
應(yīng)用:重寫以后,當創(chuàng)建子類對象以后,通過子類對象調(diào)用子父類的同名參數(shù)的方法時,實際執(zhí)行的時子類重寫父類的方法
重寫的規(guī)定:
方法的聲明:權(quán)限修飾符 返回值類型 方法名(形參列表) throws 異常的類型{
//方法體
}
約定俗稱:子類中的叫重寫的方法,父類中的叫被重寫的方法
A. 子類重寫的方法的方法名和形參列表與父類被重寫的方法的方法名和形參列表相同
B. 子類重寫的方法的權(quán)限修飾符不小于父類被重寫的方法的權(quán)限修飾符
>特殊情況:子類不能重寫父類中聲明為private權(quán)限的方法
C. 返回值類型:
>父類被重寫的方法的返回值類型是void,則子類重寫的方法的返回值類型只能是void
>父類被重寫的方法的返回值類型是A類型,則子類重寫的方法的返回值類型可以是A類或A的子類
//這樣算重寫,String是Object的子類 pulbic Object show(){//父類方法 } public String show(){//子類方法 }
//這樣不是重寫,返回值類型不同 pulbic void catch(){//父類方法 } pulbic int catch(){//子類方法 }
>父類被重寫的方法的返回值類型是基本數(shù)據(jù)類型(比如:double).則子類重寫的方法的返回值類型必須是相同的(double)
D.子類重寫的方法拋出的異常類型不大于父類被重寫的方法拋出的異常類型.(可以拋出異常類型更少、異常類型更小、不拋出異常)
子類和父類中的同名同參數(shù)的方法要么都聲明為非static的(考慮重寫),要么都聲明為static的(不是重寫)。
注意:A 父類的靜態(tài)方法不能被子類覆蓋為非靜態(tài)方法。 B 父類的靜態(tài)方法不能被子類覆蓋為靜態(tài)方法。(這兩點與上面的那句話表達的是一個意思)
E.靜態(tài)方法不能被重寫
原因:重寫依賴于類的實例,而靜態(tài)方法和類實例并沒有什么關(guān)系。而且靜態(tài)方法和類實例并沒有什么關(guān)系。而且靜態(tài)方法在編譯時就已經(jīng)確定,而方法重寫是在運行時確定的(動態(tài)綁定)。(也可以說java多態(tài)體現(xiàn)在運行時、而static在編譯時、與之相悖)
《JAVA編程思想》中多次的提到:方法是靜態(tài)的、他的行為就不具有多態(tài)性。靜態(tài)方法是與類、而非單個對象相關(guān)聯(lián)的。
區(qū)分方法的重載和重寫
重載:不表現(xiàn)為多態(tài)性。
重寫:表現(xiàn)為多態(tài)性。
從編譯和運行的角度來看:
重載,是指允許存在多個同名方法,而這些方法的參數(shù)不同。編譯器根據(jù)方法不同的參數(shù)列表,對同名方法的名稱做修飾。對于編譯器而言,這些同名方法就成了不同的方法。他們的調(diào)用地址在編譯期間就綁定了。Java的重載是可以包括父類和子類的,即子類可以重載父類的同名不同參數(shù)的方法。
所以:對于重載而言,在方法調(diào)用之前,編譯器就已經(jīng)確定了所要調(diào)用的方法,這稱為“早綁定”或“靜態(tài)綁定”;
而對于多態(tài),只有等到方法調(diào)用的那一刻,解釋運行器才會確定所要調(diào)用的具體方法,這稱為“晚綁定”或“動態(tài)綁定”;
引用一句Bruce Eckel的話:“不要犯傻,如果它不是晚綁定,它就不是多態(tài)?!?/p>
重寫規(guī)則補充
1.父類的抽象方法可以被子類通過兩種途徑重寫(即實現(xiàn)和重寫)。
2.父類的非抽象方法可以被重寫為抽象方法(此時:子類必須為抽象類)。
到此這篇關(guān)于Java構(gòu)造器方法深入理解的文章就介紹到這了,更多相關(guān)Java 構(gòu)造器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于JavaEE匿名內(nèi)部類和Lambda表達式的注意事項
這篇文章主要介紹了關(guān)于JavaEE匿名內(nèi)部類和Lambda表達式的注意事項,匿名內(nèi)部類顧名思義是沒有修飾符甚至沒有名稱的內(nèi)部類,使用匿名內(nèi)部類需要注意哪些地方,我們一起來看看吧2023-03-03Spring Boot與Kotlin處理Web表單提交的方法
本篇文章主要介紹了Spring Boot 與 Kotlin 處理Web表單提交的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-01-01Spring?Boot+微信小程序開發(fā)平臺保存微信登錄者的個人信息
這篇文章主要介紹了Spring?Boot+微信小程序開發(fā)平臺保存微信登錄者的個人信息,本文主要介紹?wx.login和wx.getProfile接口,因篇幅所限,不能對其它接口做詳細介紹?,有興趣者可以查閱官方文檔2022-05-05Spring Boot 2.5.0 重新設(shè)計的spring.sql.init 配置有啥用
前幾天Spring Boot 2.5.0發(fā)布了,其中提到了關(guān)于Datasource初始化機制的調(diào)整,有讀者私信想了解這方面做了什么調(diào)整。那么今天就要詳細說說這個重新設(shè)計的配置內(nèi)容,并結(jié)合實際情況說說我的理解和實踐建議2021-05-05使用Runtime 調(diào)用Process.waitfor導致的阻塞問題
這篇文章主要介紹了使用Runtime 調(diào)用Process.waitfor導致的阻塞問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12