詳解Java的繼承
繼承:
把多個(gè)類(lèi)相同的內(nèi)容提取到另外一個(gè)類(lèi)中,然后使用關(guān)鍵字extends來(lái)實(shí)現(xiàn)繼承
繼承的好處:
1.提高了代碼的復(fù)用性
2.提高了代碼的維護(hù)性 只需要修改父類(lèi)的內(nèi)容
3.讓類(lèi)與類(lèi)之間產(chǎn)生了繼承關(guān)系,為了后面的多態(tài)做鋪墊,要有繼承才能做多態(tài)
繼承的壞處:
1.類(lèi)的耦合性增強(qiáng)了,一個(gè)父類(lèi)改變了,子類(lèi)也跟著改變
2.只可以單個(gè)繼承,不可以多個(gè)繼承,可以多層繼承,子繼承父,父繼承爺爺
//可以多層繼承 class GrandFather{ } class Father extends GrandFather{ } class Son extends Father{ } //不可以多個(gè)繼承,比如 class Son extends Father,Mother{ }
繼承的特點(diǎn):
1.要想初始化子類(lèi) 必須先初始化父類(lèi) ,先有父親 才能有兒子
2.子類(lèi)只能繼承父類(lèi)的非私有的成員,
可以通過(guò)下面的案例的代碼和注釋來(lái)理解
class Father2{ int num = 20; Father2(){ System.out.println("這是父親的無(wú)參構(gòu)造方法"); } private void fun1(){ System.out.println(num); } } class Son2 extends Father2 { public void fun2() { System.out.println(num); // System.out.println(num2); // 子類(lèi)不能繼承父類(lèi)的私有成員變量 } } public class ExtendsDemo2 { public static void main(String[] args) { Son2 son2 = new Son2(); son2.fun2();//父親的構(gòu)造方法也執(zhí)行了,要想初始化子類(lèi),必須先初始化父類(lèi) //運(yùn)行結(jié)果:這是父親的無(wú)參構(gòu)造方法,20 //son2.fun1(); //不可以訪問(wèn)父類(lèi)的私有成員方法 } }
3.子類(lèi)不能繼承父類(lèi)的構(gòu)造方法,構(gòu)造方法是屬于該類(lèi)本身的,但是可以通過(guò)super關(guān)鍵字訪問(wèn)父類(lèi)的構(gòu)造方法,因?yàn)橐氤跏蓟宇?lèi),必須先初始化父類(lèi),是通過(guò)構(gòu)造方法進(jìn)行初始化的
4.不要為了部分功能而使用繼承,當(dāng)兩個(gè)類(lèi)語(yǔ)法滿足什么是什么,可以用繼承,比如狗、貓、老虎都是動(dòng)物。
繼承和成員變量之間的關(guān)系:
a.當(dāng)子類(lèi)的成員變量和父類(lèi)中的成員變量名字一樣時(shí),
查找:1.先在方法的局部范圍內(nèi)進(jìn)行查找,如果找到就返回
2.如果在方法局部范圍找不到,去本類(lèi)成員位置(成員變量)上查找,如果找到就返回
3.如果在成員位置上也找不到,去父類(lèi)成員位置中查找,如果找到就返回
4.如果在父類(lèi)成員位置找不到,報(bào)錯(cuò)
b.當(dāng)子類(lèi)的成員變量和父類(lèi)的成員變量名字不一樣:名字是誰(shuí)就訪問(wèn)誰(shuí)
this關(guān)鍵字和super關(guān)鍵字的區(qū)別
區(qū)別:this代表的是調(diào)用該類(lèi)的當(dāng)前對(duì)象 ,super代表的是父類(lèi)存儲(chǔ)空間的標(biāo)識(shí)(父類(lèi)的引用,可以操作父類(lèi)的成員)
使用方法:
1.訪問(wèn)成員變量 this.成員變量訪問(wèn)的是本類(lèi)中的成員變量,super.成員變量訪問(wèn)的是父類(lèi)中的成員變量
//用this和super關(guān)鍵字訪問(wèn)本類(lèi)和父類(lèi)中的成員變量 class Father3{ int num= 10; } class Son3 extends Father3{ int num = 20; public void show(){ int num= 30; System.out.println(num); System.out.println(this.num); System.out.println(super.num); } } public class ExtendsDemo3 { public static void main(String[] args) { Son3 son3 = new Son3(); son3.show(); } }
2.訪問(wèn)構(gòu)造方法
要想初始化子類(lèi),必選先初始化父類(lèi) ,因?yàn)樽宇?lèi)會(huì)繼承父類(lèi)的數(shù)據(jù),甚至可能會(huì)使用父類(lèi)的
數(shù)據(jù),所以在子類(lèi)初始化之前,一定會(huì)先完成父類(lèi)的初始化
注意: 每個(gè)子類(lèi)的構(gòu)造方法的第一句話默認(rèn)是super()
//這個(gè)案例執(zhí)行出,會(huì)先訪問(wèn)父類(lèi)的無(wú)參構(gòu)造方法,再訪問(wèn)子類(lèi)的帶參構(gòu)造方法 class Father8 { int age; Father8() { System.out.println("父類(lèi)中的無(wú)參構(gòu)造方法"); } Father8(String s) { System.out.println("這是父類(lèi)帶參數(shù)的構(gòu)造方法" + s); } } class Son8 extends Father8 { Son8() { System.out.println("子類(lèi)的無(wú)參構(gòu)造方法"); } Son8(String s) { System.out.println("子類(lèi)帶參數(shù)的構(gòu)造方法" + s); } } public class ExtendsDemo7 { public static void main(String[] args) { Son8 s1 = new Son8("小王"); } }
上面這個(gè)案例執(zhí)行結(jié)果,會(huì)先訪問(wèn)父類(lèi)的無(wú)參構(gòu)造方法,再訪問(wèn)子類(lèi)的帶參構(gòu)造方法,因?yàn)樵谧宇?lèi)的無(wú)參構(gòu)造方法里面有一個(gè)隱藏super();,會(huì)指引我們先訪問(wèn)父類(lèi)的無(wú)參構(gòu)造方法,如果我們要訪問(wèn)父類(lèi)的帶參構(gòu)造方法,我們需要手寫(xiě)一個(gè)super(參數(shù));來(lái)指引訪問(wèn)父類(lèi)的帶參構(gòu)造方法。
3.訪問(wèn)成員方法:this.成員方法(),super.成員方法()
1、當(dāng)子類(lèi)的成員方法名與父類(lèi)成員方法名不一樣的時(shí)候,該調(diào)用誰(shuí)就調(diào)用誰(shuí)的
2、當(dāng)子類(lèi)的成員方法名與父類(lèi)成員方法名一樣的時(shí)候,怎么辦呢?(就近原則)
1)現(xiàn)在本類(lèi)中查找,如果有就調(diào)用,如果沒(méi)有去父類(lèi)中查找,
2)如果父類(lèi)中有方法,就調(diào)用父類(lèi)的
3)如果連父類(lèi)中都沒(méi)有要調(diào)用的方法名,報(bào)錯(cuò),提示找不到方法。
方法的重寫(xiě):
如果子類(lèi)的方法聲明和父類(lèi)的方法聲明一樣,這樣的現(xiàn)象叫方法的重寫(xiě),重寫(xiě)現(xiàn)象是發(fā)生在繼承的關(guān)系中的,子類(lèi)和父類(lèi)的方法聲明一樣,但是實(shí)現(xiàn)的結(jié)果不一樣。比如:我在父類(lèi)中書(shū)寫(xiě)一個(gè)study方法,輸出“學(xué)習(xí)java”,在子類(lèi)中也書(shū)寫(xiě)一個(gè)聲明一樣的study方法,輸出“學(xué)習(xí)高等數(shù)學(xué)”,在這里雖然父類(lèi)和子類(lèi)的聲明一樣,但是我們最終的實(shí)現(xiàn)不一樣,這就叫方法的重寫(xiě)。
總結(jié)
到此這篇關(guān)于詳解Java的繼承的文章就介紹到這了,更多相關(guān)Java繼承內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL如何設(shè)置自動(dòng)增長(zhǎng)序列SEQUENCE的方法
本文主要介紹了MySQL如何設(shè)置自動(dòng)增長(zhǎng)序列SEQUENCE的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12java 使用策略模式操作JDBC數(shù)據(jù)庫(kù)
這篇文章主要介紹了java 使用策略模式操作JDBC數(shù)據(jù)庫(kù)的相關(guān)資料,這里提供實(shí)例實(shí)現(xiàn)對(duì)JDBC數(shù)據(jù)庫(kù)的操作增刪改查的功能,需要的朋友可以參考下2017-08-08SpringBoot+OCR實(shí)現(xiàn)PDF內(nèi)容識(shí)別的示例代碼
在SpringBoot中,您可以結(jié)合OCR庫(kù)來(lái)實(shí)現(xiàn)對(duì)PDF文件內(nèi)容的識(shí)別和提取,本文就來(lái)介紹一下如何使用 Tesseract 和 pdf2image 對(duì) PDF 文件進(jìn)行OCR識(shí)別和提取,具有一定的參考價(jià)值,感興趣的可以了解一下2023-12-12Elasticsearch查詢Range Query語(yǔ)法示例
這篇文章主要為大家介紹了Elasticsearch查詢Range Query語(yǔ)法示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04解決HttpPost+json請(qǐng)求---服務(wù)器中文亂碼及其他問(wèn)題
這篇文章主要介紹了解決HttpPost+json請(qǐng)求---服務(wù)器中文亂碼及其他問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01Java編程實(shí)現(xiàn)從尾到頭打印鏈表代碼實(shí)例
這篇文章主要介紹了Java編程實(shí)現(xiàn)從尾到頭打印鏈表代碼實(shí)例,小編覺(jué)得挺不錯(cuò)的,這里分享給大家,供需要的朋友參考。2017-10-10SpringMVC下實(shí)現(xiàn)Excel文件上傳下載
這篇文章主要為大家詳細(xì)介紹了SpringMVC下實(shí)現(xiàn)Excel文件上傳下載,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03java簡(jiǎn)單解析xls文件的方法示例【讀取和寫(xiě)入】
這篇文章主要介紹了java簡(jiǎn)單解析xls文件的方法,結(jié)合實(shí)例形式分析了java針對(duì)xls文件的讀取和寫(xiě)入相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2017-06-06java線程并發(fā)blockingqueue類(lèi)使用示例
BlockingQueue是一種特殊的Queue,若BlockingQueue是空的,從BlockingQueue取東西的操作將會(huì)被阻斷進(jìn)入等待狀態(tài)直到BlocingkQueue進(jìn)了新貨才會(huì)被喚醒,下面是用BlockingQueue來(lái)實(shí)現(xiàn)Producer和Consumer的例子2014-01-01