多繼承的優缺點
優點:對象可以調用多個父類中的方法
缺點:如果派生類所繼承的多個父類有相同的父類(也就是一個菱形繼承結構),而派生類對象需要調用這個祖先類的方法,就會容易出現二義性。
1、java 與 C++ 的不同點在於多繼承。
Java:不能多繼承,只能單繼承,但可以實現多個接口
C++:可以實現多繼承。
例如: class A extends B implements C,D,E {}
2、如若寫成 interface A extends B,C,D 可以編譯通過,這樣是不是違背了 JAVA 的單繼承特性呢?
(1)接口可以繼承多個接口是因為接口里面的定義的方法都是未實現的,不會增加復雜性。
(2)接口不是類,而是對類的一組需求的描述。接口絕不能含有實例域,也不能在接口中實現方法。接口可以實現多繼承不會增加代碼的復雜性。
(3)多繼承是發生在執行期間的,而不是在編譯期間,所以可以編譯通過,並且不違背 Java 是單繼承的。
3、為什么接口可以繼承多個接口?
因為接口定義的都是抽象的方法,而且不能在接口中實現方法。所以,接口繼承多個接口,並不會使接口的結構變得很復雜。相反,這樣做,還能給一個團隊在開發的過程中,提供很多便利。
單繼承指的是 class,而不是 interface. interface 是可以多繼承的。
接口可以多繼承可以被多實現,因為接口中的方法都是抽象的,這些方法都被實現的類所實現,即使多個父接口中有同名的方法,在調用這些方法時調用的是子類的中被實現的方法,不存在歧義;同時,接口的中只有靜態的常量,但是由於靜態變量是在編譯期決定調用關系的,即使存在一定的沖突也會在編譯時提示出錯;而引用靜態變量一般直接使用類名或接口名,從而避免產生歧義,因此也不存在多繼承的第一個缺點。 對於一個接口繼承多個父接口的情況也一樣不存在這些缺點。所以接口可以多繼承。
4、為什么 JAVA 改成只能單繼承?
因為在 C++ 中一個類是可以繼承自多個類,但這樣的機制會使類的結構變的很復雜,所以 JAVA 將 C++ 這一機制通過接口得以改善。
JAVA 中不允許類多重繼承,只能單一繼承,但有些情況單一繼承並不能表達出現實世界中的某些邏輯關系,所以就提出了通過接口來實現多重繼承。
5、多繼承中 父類方法重復
public interface interfaceA {
public void fun1();
public void fun2();
public void fun3();
}
public interface interfaceB {
public void fun1();
public void fun2(String str);
public String fun3();
}
public interface interfaceC extends interfaceA,interfaceB {
}
public class Test implements interfaceC {
@Override
public void fun1(){
}
@Override
public void fun2(){
}
@Override
public void fun2(String str){
}
@Override
public void fun3(){// 報錯
}
}
總結:
多繼承的fun1 和fun2 分別是同一個函數和重載的兩個函數(參數不同) ,但是fun3只是返回值不同,不符合java重載的規范,編譯器無法區分,所以不論寫void fun3 還是String fun3 還是兩個都寫,都是錯誤的