溫馨提示×

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

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

Java只能單繼承的原因是什么

發(fā)布時(shí)間:2023-03-15 14:09:04 來(lái)源:億速云 閱讀:66 作者:iii 欄目:開(kāi)發(fā)技術(shù)

今天小編給大家分享一下Java只能單繼承的原因是什么的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來(lái)了解一下吧。

多繼承雖然能使子類同時(shí)擁有多個(gè)父類的特征,但是其缺點(diǎn)也是很顯著的,主要有兩方面:

(1)如果在一個(gè)子類繼承的多個(gè)父類中擁有相同名字的實(shí)例變量,子類在引用該變量時(shí)將產(chǎn)生歧義,無(wú)法判斷應(yīng)該使用哪個(gè)父類的變量。

例如: 類ClassA:

public class ClassA {
       protected int varSame = 0;
}
 
           類ClassB:
 
public class ClassB {
        protected int varSame = 1;
}

子類ClassC:(假設(shè)允許類與類之間多繼承)

           public class ClassC extends ClassA, ClassB {
                   public void printOut() {
                           System.out.println(super.varSame);
                   }
                   public static void main(String[] args) {
                           ClassC classC = new ClassC();
                           classC.printOut();
                   }
           }

上面程序的運(yùn)行結(jié)果會(huì)是什么呢?輸出0還是1?

(2)如果在一個(gè)子類繼承的多個(gè)父類中擁有相同方法,子類中有沒(méi)有覆蓋該方法,那么調(diào)用該方法時(shí)將產(chǎn)生歧義,無(wú)法判斷應(yīng)該調(diào)用哪個(gè)父類的方法。

例如: 類ClassA:

           public class ClassA {
                   public void printOut() {
                           System.out.println(0);
                   }
           }

類ClassB:

           public class ClassB {
                   public void printOut() {
                           System.out.println(1);
                   }
           }

子類ClassC:(假設(shè)允許類與類之間多繼承)

public class ClassC extends ClassA, ClassB {
                   public static void main(String[] args) {
                           ClassA classA = new ClassC();
                           classA.printOut();      // -------------------------  A行
                           ClassB classB = new ClassC();
                           classB.printOut();      // -------------------------  B行
                           ClassC classC = new ClassC();
                           classC.printOut();       //-------------------------  C行
                   }
           }

上面程序的運(yùn)行結(jié)果會(huì)是什么呢?A、B、C三行的輸出是0還是1? 正因?yàn)橛幸陨系闹旅秉c(diǎn),所以java中禁止一個(gè)類繼承多個(gè)父類;

在接口中不能有實(shí)例變量,只能有靜態(tài)的常量,不能有具體的方法(包含方法體),只能有抽象方法,因此也就摒棄了多繼承的缺點(diǎn)。 對(duì)于一個(gè)類實(shí)現(xiàn)多個(gè)接口的情況,因?yàn)榻涌谥挥谐橄蠓椒?,具體方法只能由實(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)。

先屢清楚繼承和實(shí)現(xiàn)的區(qū)別:

1 類繼承類,實(shí)現(xiàn)接口。接口繼承接口。

2 類只能單繼承類(抽象類和非抽象類), 可以多實(shí)現(xiàn)接口。而接口可以多繼承接口。

分析原因:

Java中類不能多繼承類是為了安全。因?yàn)闊o(wú)論是抽象類還是非抽象類都包含非抽象的方法(非抽象類也可能沒(méi)有),當(dāng)類可以多繼承類時(shí),被繼承的不同的父類可能會(huì)有同名同參的方法,如果子類也沒(méi)有重寫這個(gè)同名同參的方法,則在子類的實(shí)例調(diào)用這個(gè)方法的時(shí)候就會(huì)出現(xiàn)沖突。

若為多繼承,那么當(dāng)多個(gè)父類中有重復(fù)的屬性或者方法時(shí),子類的調(diào)用結(jié)果會(huì)含糊不清,因此用了單繼承。

為什么是多實(shí)現(xiàn)呢?

通過(guò)實(shí)現(xiàn)接口拓展了類的功能,若實(shí)現(xiàn)的多個(gè)接口中有重復(fù)的方法也沒(méi)關(guān)系,因?yàn)閷?shí)現(xiàn)類中必須重寫接口中的方法,所以調(diào)用時(shí)還是調(diào)用的實(shí)現(xiàn)類中重寫的方法。

那么各個(gè)接口中重復(fù)的變量又是怎么回事呢?

接口中,所有屬性都是 static final修飾的,即常量,這個(gè)什么意思呢,由于JVM的底層機(jī)制,所有static final修飾的變量都在編譯時(shí)期確定了其值,若在使用時(shí),兩個(gè)相同的常量值不同,在編譯時(shí)期就不能通過(guò)。

例如:class A繼承了class B 和class C, 但是 class B和class C中有同名同參的方法method,且在A中并沒(méi)有重寫方法method,那在A的實(shí)例中調(diào)用method方法就會(huì)出現(xiàn)沖突,jvm就會(huì)不知道到底該調(diào)用哪一個(gè)方法。

class B { method(){}};
class C {method() {}};
class A extends B, C{};
A a = new A(); 
a.method();

此時(shí)在執(zhí)行a.method()時(shí)沖突就會(huì)出現(xiàn)。

所以Java只能單繼承。

以上就是“Java只能單繼承的原因是什么”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(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