java為何不能多繼承的原因詳解
多繼承指一個(gè)子類能同時(shí)繼承于多個(gè)父類,從而同時(shí)擁有多個(gè)父類的特征,但缺點(diǎn)是顯著的。
1.若子類繼承的父類中擁有相同的成員變量,子類在引用該變量時(shí)將無法判別使用哪個(gè)父類的成員變量。
如:
public class classA // 父類 classA { private int num = 0; } public class classB // 父類 classB { private int num = 1; } public class classC extends classA,classB // 子類 classC 繼承于 classA 和 classB { public static void main(String [] args) { classC obj = new classC(); obj.print(); // 調(diào)用父類成員變量 num , 那 num 等于 0 還是 1 ? } public void print() { System.out.println(super.num); } }
2.若一個(gè)子類繼承的多個(gè)父類擁有相同方法,同時(shí)子類并未覆蓋該方法(若覆蓋,則直接使用子類中該方法),那么調(diào)用該方法時(shí)將無法確定調(diào)用哪個(gè)父類的方法。
如:
public class classA // 父類 classA { public void fun() { System.out.print("hello"); } } public class classB // 父類 classB { public void fun() { System.out.print("hello"); } } public class classC extends classA,classB { public static void main(String [] args) { classC t = new classC(); t.print(); } public void print() { super.fun(); // 調(diào)用父類中 fun 方法,但由于classA、classB都有fun()方法,將無法確定使用 // 哪個(gè)父類中的方法 } }
因此,Java僅允許單繼承,即一個(gè)子類只能繼承于一個(gè)父類。但為了拓展子類的功能,Java使用接口以克服不使用多繼承帶來的不足。
接口是一個(gè)特殊的抽象類,接口中成員變量均默認(rèn)為 static final 類型,即常量,且接口中的方法都為抽象的,都沒有方法體。
具體方法只能由實(shí)現(xiàn)接口的類實(shí)現(xiàn),在調(diào)用的時(shí)候始終只會(huì)調(diào)用實(shí)現(xiàn)類的方法(不存在歧義),因此不存在 多繼承的第二個(gè)缺點(diǎn);而又因?yàn)榻涌谥挥徐o態(tài)的常量,但是由于靜態(tài)變量是在編譯期決定調(diào)用關(guān)系的,即使存在一定的沖突也會(huì)在編譯時(shí)提示出錯(cuò);而引用靜態(tài)變量一般直接使用類名或接口名,從而避免產(chǎn)生歧義,因此也不存在多繼承的第一個(gè)缺點(diǎn)。 對于一個(gè)接口繼承多個(gè)父接口的情況也一樣不存在這些缺點(diǎn)。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JavaEE開發(fā)之SpringMVC中的自定義消息轉(zhuǎn)換器與文件上傳
本篇文章主要介紹了SpringMVC的相關(guān)知識。同時(shí)也會(huì)介紹到j(luò)s、css這些靜態(tài)文件的加載配置,以及服務(wù)器推送的兩種實(shí)現(xiàn)方式并且給出了兩者的區(qū)別。下面跟著小編一起來看下吧2017-04-04SpringBoot前后端分離實(shí)現(xiàn)驗(yàn)證碼操作
驗(yàn)證碼的功能是防止非法用戶惡意去訪問登錄接口而設(shè)置的一個(gè)功能,今天我們就來看看在前后端分離的項(xiàng)目中,SpringBoot是如何提供服務(wù)的2022-05-05分布式面試消息隊(duì)列解決消息重復(fù)保證消息順序
這篇文章主要介紹了分布式面試問題:分布式消息隊(duì)列如何解決消息重復(fù)并保證消息順序面試問題解答,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03java集合模擬實(shí)現(xiàn)斗地主洗牌和發(fā)牌
這篇文章主要為大家詳細(xì)介紹了java集合模擬實(shí)現(xiàn)斗地主洗牌和發(fā)牌,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09