更新時(shí)間:2020-07-16 16:21:54 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽2254次
在Java中,子類(lèi)繼承父類(lèi),類(lèi)實(shí)現(xiàn)接口是屬于常識(shí)性的內(nèi)容了,作為一個(gè)Java程序員應(yīng)該也比較熟悉。不過(guò)子類(lèi)繼承父類(lèi),類(lèi)實(shí)現(xiàn)接口中還是有一些小細(xì)節(jié)值得注意一下,本文就從個(gè)人工作、學(xué)習(xí)中入手,總結(jié)一些細(xì)節(jié)性的內(nèi)容,以更進(jìn)一步地掌握繼承、實(shí)現(xiàn)的關(guān)系。現(xiàn)在只是寫(xiě)一些目前碰到的內(nèi)容,以后只要想到了、碰到了任何繼承、實(shí)現(xiàn)相關(guān)問(wèn)題,都會(huì)保持更新此文。
接口A有void C()方法,接口B有int C()方法,則無(wú)法同時(shí)實(shí)現(xiàn)這兩個(gè)接口
Java為了彌補(bǔ)類(lèi)單繼承的不足,引入了類(lèi)多實(shí)現(xiàn)接口的機(jī)制,不過(guò)多實(shí)現(xiàn)某個(gè)接口也是有一定限制的,比如:
public?interface?A
{
?void?C();
}
public?interface?B
{
?int?C();
}
那么同時(shí)實(shí)現(xiàn)這兩個(gè)接口是不可能的:
這個(gè)錯(cuò)誤是無(wú)法被修復(fù)的。試想,類(lèi)AB實(shí)現(xiàn)接口A和接口B,那么接口A里面的抽象方法和接口B里面的抽象方法參數(shù)列表都相同僅有返回值不同,類(lèi)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的子類(lèi)
有一個(gè)接口A,B實(shí)現(xiàn)了A接口,C繼承自B類(lèi),則C也是A的子類(lèi),看一下:
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)類(lèi),那為什么LinkedHashMap還要實(shí)現(xiàn)Map呢,豈不是多此一舉嗎?由此想到了會(huì)不會(huì)是因?yàn)槔^承了HashMap不代表LinkedHashMap是Map的子類(lèi)所以LinkedHashMap要專門(mén)再實(shí)現(xiàn)一下Map,做了上面的實(shí)驗(yàn),發(fā)現(xiàn)是我多慮了,可能Sun的開(kāi)發(fā)人員就想這么寫(xiě)吧,呵呵。
父子類(lèi)中有同名屬性
這不是錯(cuò)誤,只是會(huì)造成歧義而已,而且也可能會(huì)造成返回我們不想要的結(jié)果,主要原因可能是開(kāi)發(fā)者對(duì)父類(lèi)代碼不熟悉所導(dǎo)致的(尤其是在父類(lèi)定義的屬性一大堆的場(chǎng)景下)。舉個(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():100
Son getSonI():50
提出這個(gè)問(wèn)題是因?yàn)槲覀儞?dān)心父子類(lèi)的同名屬性會(huì)不會(huì)存在覆蓋的情況,從運(yùn)行結(jié)果來(lái)看,完全不用擔(dān)心這個(gè)問(wèn)題。
一個(gè)實(shí)現(xiàn)類(lèi)繼承自一個(gè)抽象類(lèi)并且實(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()方法
}
以上就是動(dòng)力節(jié)點(diǎn)java培訓(xùn)機(jī)構(gòu)的小編針對(duì)“編程基礎(chǔ)之Java中類(lèi)繼承、接口實(shí)現(xiàn)的一些細(xì)節(jié)”的內(nèi)容進(jìn)行的回答,希望對(duì)大家有所幫助,如有疑問(wèn),請(qǐng)?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。
相關(guān)閱讀
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)
初級(jí) 202925
初級(jí) 203221
初級(jí) 202629
初級(jí) 203743