6 回答

TA貢獻(xiàn)57條經(jīng)驗(yàn) 獲得超235個(gè)贊
先舉一個(gè)多重繼承的例子,我們定義一個(gè)動(dòng)物(類)既是狗(父類1)也是貓(父類2),兩個(gè)父類都有“叫”這個(gè)方法。那么當(dāng)我們調(diào)用“叫”這個(gè)方法時(shí),它就不知道是狗叫還是貓叫了,這就是多重繼承的沖突。
而java對(duì)此的解決方法是,一個(gè)物體的本質(zhì)只能有一個(gè)。一個(gè)動(dòng)物只能是狗或只能是貓,如果你想創(chuàng)造一個(gè)會(huì)玩毛線球會(huì)玩激光(被激光玩?)的狗,那么只需要?jiǎng)?chuàng)造一個(gè)描述這類行為的接口(就叫玩耍吧),然后在自己的類里面實(shí)現(xiàn)“玩?!苯涌?,具體實(shí)現(xiàn)這些玩的行為,最終你同樣會(huì)得到一個(gè)既像狗又像貓的動(dòng)物。如果你想讓這個(gè)動(dòng)物叫起來(lái)像貓而不是狗,那么使用覆寫(xiě)(override)機(jī)制,子類里重新定義“叫”這個(gè)行為即可。但是無(wú)論如何,這樣得到的類是絕對(duì)不會(huì)有多重繼承的沖突的。
再來(lái)說(shuō)說(shuō)abstract class和interface的區(qū)別。
abstract class的核心在于,我知道一類物體的部分行為(和屬性),但是不清楚另一部分的行為(和屬性),所以我不能自己實(shí)例化。還是剛才那個(gè)例子,如果你有個(gè)abstract class叫哺乳動(dòng)物,那么你可以定義他們胎生,恒定體溫等共同的行為,但是具體“叫”這個(gè)行為時(shí),你得留著讓非abstract的狗和貓等等子類具體實(shí)現(xiàn)。
interface的核心在于,我只知道這個(gè)物體能干什么,具體是什么不需要遵從類的繼承關(guān)系。比如上述的“玩?!眎nterface,狗有狗的玩法,貓有貓的玩法,妖魔鬼怪機(jī)器人都可以玩耍,只要你告訴我這個(gè)物體有玩耍接口,我就能讓它玩起來(lái)(??????) ?
所以abstract class和interface是不能互相替代的,interface不能定義(它只做了聲明)共同的行為,事實(shí)上它也不能定義“非常量”的變量。而abstract class只是一種分類的抽象,它不能橫跨類別來(lái)描述一類行為,它使得針對(duì)“別的分類方式”的抽象變得無(wú)法實(shí)現(xiàn)(所以需要接口來(lái)幫忙)。而多重繼承不但會(huì)造成沖突,還讓一個(gè)類變得不倫不類,看不出這個(gè)類的本質(zhì),所以java毅然舍棄掉了這個(gè)禍害。
不知題主有沒(méi)有理解一些。

TA貢獻(xiàn)6條經(jīng)驗(yàn) 獲得超5個(gè)贊
我就不長(zhǎng)篇大論了。
多繼承容易引發(fā)沖突,單繼承對(duì)于后續(xù)的開(kāi)發(fā)容易理解,并且使得結(jié)構(gòu)清晰明了。
然后為了克服單繼承的弱點(diǎn),java便開(kāi)發(fā)了接口這個(gè)東西。代替多繼承來(lái)使用。
純手打,望采納。

TA貢獻(xiàn)4條經(jīng)驗(yàn) 獲得超1個(gè)贊
JAVA語(yǔ)言在早期的設(shè)計(jì)思想是簡(jiǎn)化,易于學(xué)習(xí)和使用,放棄了C++的部分功能。但現(xiàn)在也越來(lái)越復(fù)雜了。

TA貢獻(xiàn)50條經(jīng)驗(yàn) 獲得超11個(gè)贊
多繼承容易造成面向?qū)ο蟮母鞣N問(wèn)題,你想想啊,兒子繼承父親,多繼承就是繼承多個(gè)父親....好多爸爸,從面向?qū)ο蟮倪壿媶?wèn)題上來(lái)看這樣不好不好。 PS:不要再問(wèn)為什么C++支持多繼承。

TA貢獻(xiàn)89條經(jīng)驗(yàn) 獲得超59個(gè)贊
類定義屬性和方法 描述某一類事物的抽象
而接口定義的是行為 并不限于任何具體意向
按照邏輯上來(lái)說(shuō) 單繼承更明確 一個(gè)子類就應(yīng)該是其父類代表的事物中的某個(gè)更具體的類別 不應(yīng)該即是這種東西又是那種東西
而從實(shí)用角度上來(lái)說(shuō) 單繼承易讀 易維護(hù) 語(yǔ)義清晰 邏輯清楚
而接口則不同 接口只定義一些公共行為 比如有兩個(gè)接口 一個(gè)定義了跑這個(gè)動(dòng)作 另一個(gè)定義了走這個(gè)動(dòng)作 人這個(gè)類就可以同時(shí)實(shí)現(xiàn)這兩個(gè)接口所定義的行為
類對(duì)接口的implements稱作實(shí)現(xiàn) 不能叫做繼承
當(dāng)然 接口可以多繼承接口 因?yàn)榻涌谥欢x行為 并不包含類別的含義 不指代具體的某類事物 而且 從語(yǔ)義上來(lái)說(shuō) 接口對(duì)接口的繼承稱之為擴(kuò)展更為合適

TA貢獻(xiàn)392條經(jīng)驗(yàn) 獲得超170個(gè)贊
太過(guò)繁瑣,改進(jìn)了C++的多繼承,改成只有一個(gè)父類,這樣就不需要自己管理繁瑣的內(nèi)存分配與釋放,java 虛擬機(jī)就能好好工作了
添加回答
舉報(bào)