在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ù)。