溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

java為何不能多繼承的原因詳解

發(fā)布時(shí)間:2020-09-16 06:37:22 來源:腳本之家 閱讀:176 作者:(*-*)浩 欄目:編程語(yǔ)言

多繼承指一個(gè)子類能同時(shí)繼承于多個(gè)父類,從而同時(shí)擁有多個(gè)父類的特征,但缺點(diǎn)是顯著的。

1.若子類繼承的父類中擁有相同的成員變量,子類在引用該變量時(shí)將無(wú)法判別使用哪個(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í)將無(wú)法確定調(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()方法,將無(wú)法確定使用
// 哪個(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)。 對(duì)于一個(gè)接口繼承多個(gè)父接口的情況也一樣不存在這些缺點(diǎn)。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI