編程基礎(chǔ)之Java中類繼承、接口實(shí)現(xiàn)的一些細(xì)節(jié)

編程基礎(chǔ)之Java中類繼承、接口實(shí)現(xiàn)的一些細(xì)節(jié)

長沙中公優(yōu)就業(yè)      2022-03-21 09:10:01     14

編程基礎(chǔ)之Java中類繼承、接口實(shí)現(xiàn)的一些細(xì)節(jié),在Java中,子類繼承父類,類實(shí)現(xiàn)接口是屬于常識性的內(nèi)容了,作為一個(gè)Java程序員應(yīng)該也比較熟悉。不過子類繼承父類,類實(shí)現(xiàn)接口中

課程價(jià)格 請咨詢

上課時(shí)段: 授課校區(qū):

詳細(xì)介紹

在Java中,子類繼承父類,類實(shí)現(xiàn)接口是屬于常識性的內(nèi)容了,作為一個(gè)Java程序員應(yīng)該也比較熟悉。不過子類繼承父類,類實(shí)現(xiàn)接口中還是有一些小細(xì)節(jié)值得注意一下,本文就從個(gè)人工作、學(xué)習(xí)中入手,總結(jié)一些細(xì)節(jié)性的內(nèi)容,以更進(jìn)一步地掌握繼承、實(shí)現(xiàn)的關(guān)系?,F(xiàn)在只是寫一些目前碰到的內(nèi)容,以后只要想到了、碰到了任何繼承、實(shí)現(xiàn)相關(guān)問題,都會(huì)保持更新此文。

接口A有void C()方法,接口B有int C()方法,則無法同時(shí)實(shí)現(xiàn)這兩個(gè)接口

Java為了彌補(bǔ)類單繼承的不足,引入了類多實(shí)現(xiàn)接口的機(jī)制,不過多實(shí)現(xiàn)某個(gè)接口也是有一定限制的,比如:

public?interface?A{?void?C();}public?interface?B{?int?C();}

那么同時(shí)實(shí)現(xiàn)這兩個(gè)接口是不可能的:

這個(gè)錯(cuò)誤是無法被修復(fù)的。試想,類AB實(shí)現(xiàn)接口A和接口B,那么接口A里面的抽象方法和接口B里面的抽象方法參數(shù)列表都相同僅有返回值不同,類AB應(yīng)該實(shí)現(xiàn)哪個(gè)呢?實(shí)現(xiàn)接口A的"void C()",那么接口B的"int C()"怎么辦?實(shí)現(xiàn)接口B的"int C()"那么接口A的"void C()"怎么辦?因?yàn)?quot;void C()"、"int C()"屬于方法參數(shù)相同,返回值不同,這兩個(gè)方法是不可以重載的,所以同時(shí)實(shí)現(xiàn)兩個(gè)方法也不可能。因此,在這里Java只能報(bào)錯(cuò)了。

A是接口,B實(shí)現(xiàn)A,C繼承B,則C也是A的子類

有一個(gè)接口A,B實(shí)現(xiàn)了A接口,C繼承自B類,則C也是A的子類,看一下:

public?interface?A{}public?class?B?implements?A{}public?class?C?extends?B{}public?static?void?main(String[]?args){?C?c?=?new?C();?System.out.println(c?instanceof?A);}

返回結(jié)果是true。這是一個(gè)不難理解的結(jié)論,想到求證這個(gè)結(jié)論是因?yàn)橛幸淮卧谘芯縧inkedHashMap的時(shí)候:

public?class?linkedHashMap?extends?HashMap?implements?Map

既然linkedHashMap已經(jīng)繼承了HashMap了,HashMap是Map的實(shí)現(xiàn)類,那為什么linkedHashMap還要實(shí)現(xiàn)Map呢,豈不是多此一舉嗎?由此想到了會(huì)不會(huì)是因?yàn)槔^承了HashMap不代表linkedHashMap是Map的子類所以linkedHashMap要專門再實(shí)現(xiàn)一下Map,做了上面的實(shí)驗(yàn),發(fā)現(xiàn)是我多慮了,可能Sun的開發(fā)人員就想這么寫吧,呵呵。

父子類中有同名屬性

這不是錯(cuò)誤,只是會(huì)造成歧義而已,而且也可能會(huì)造成返回我們不想要的結(jié)果,主要原因可能是開發(fā)者對父類代碼不熟悉所導(dǎo)致的(尤其是在父類定義的屬性一大堆的場景下)。舉個(gè)例子:

public?class?Father{?private?int?i;??public?Father()?{?}?public?Father(int?i)?{?this.i?=?i;?}?public?int?getFatherI()?{?return?i;?}}public?class?Son?extends?Father{?private?int?i;??public?Son(int?i)?{?super(100);?this.i?=?i;?}?public?int?getSonI()?{?return?i;?}}public?static?void?main(String[]?args){?Son?son?=?new?Son(50);?System.out.println("Son?getFatherI():"?+?son.getFatherI());?System.out.println("Son?getSonI():"?+?son.getSonI());}運(yùn)行結(jié)果為:Son getFatherI():100Son getSonI():50

提出這個(gè)問題是因?yàn)槲覀儞?dān)心父子類的同名屬性會(huì)不會(huì)存在覆蓋的情況,從運(yùn)行結(jié)果來看,完全不用擔(dān)心這個(gè)問題。

一個(gè)實(shí)現(xiàn)類繼承自一個(gè)抽象類并且實(shí)現(xiàn)了多個(gè)接口,那么必須實(shí)現(xiàn)所有未被實(shí)現(xiàn)的抽象方法

舉個(gè)例子:

public?interface?InterfaceA{?void?A1();?void?A2();}public?interface?InterfaceB{?void?B1();?void?B2();}public?abstract?class?AbstractC?implements?InterfaceA,?InterfaceB{?public?void?A1(){}?//?我實(shí)現(xiàn)了InterfaceA的A1()方法?public?void?B2(){}?//?我實(shí)現(xiàn)了InterfaceB的B2()方法??abstract?void?C();?//?我自己定義了一個(gè)抽象方法}

那么要定義一個(gè)ClassD繼承自AbstractC,則必須:

public?class?ClassD?extends?AbstractC{?public?void?A2(){}?//?我必須實(shí)現(xiàn)InterfaceA中未被實(shí)現(xiàn)的A2()方法?public?void?B1(){}?//?我必須實(shí)現(xiàn)InterfaceB中未被實(shí)現(xiàn)的B1()方法?void?C(){}?//?我必須實(shí)現(xiàn)AbstractC中未被實(shí)現(xiàn)的C()方法}

以上就是長沙中公優(yōu)就業(yè)java培訓(xùn)機(jī)構(gòu)的小編針對“編程基礎(chǔ)之Java中類繼承、接口實(shí)現(xiàn)的一些細(xì)節(jié)”的內(nèi)容進(jìn)行的回答,希望對大家有所幫助,如有疑問,請?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。

培訓(xùn)啦提醒您:交易時(shí)請核實(shí)對方資質(zhì),對于過大宣傳或承諾需謹(jǐn)慎!任何要求預(yù)付定金、匯款等方式均存在風(fēng)險(xiǎn),謹(jǐn)防上當(dāng)。