更新時間:2020-10-28 17:52:51 來源:動力節(jié)點 瀏覽1271次
我們都知道Java的類只能繼承一個類,但可以實現(xiàn)多個接口。然而很多人其實不知道Java中的接口卻可以繼承多個接口,這兩者之前并不沖突。本文就來說一說Java接口多繼承的相關(guān)知識。
進入主題之前,為了更方便我們理解Java接口多繼承,我們先來拓展一下。Java為什么只支持單繼承呢?
我們不妨假設(shè)Java支持多繼承,舉個例子,在這里有個A類,我們又編寫了兩個類B類和C類,并且B類和C類分別繼承了A類,并且對A類的同一個方法進行了覆蓋。如果此時我們再次編寫了一個D類,并且D類以多繼承的方式同時集成了B類和C類,那么D類也會繼承B類和C類從A類中重載的方法,如下圖所示。那么問題來了,D類也開始犯迷糊了,我到底應(yīng)該哪個繼承哪個類中的方法呢,因為類是結(jié)構(gòu)性的,這樣就會造成結(jié)構(gòu)上的混亂。這就是多繼承的菱形繼承問題。
同時我們知道C++是支持多繼承的,因為它解決了這個問題(我對C++不太熟,查了下資料,好像是通過虛基類實現(xiàn)的吧)。但是Java本著簡單的原則,舍棄了多繼承。
好,進入正題。我們還是舉個實例來演示一下接口的多繼承。
鸚鵡是鳥,鳥會飛,也會唱歌。我們來模仿一下:
一、會飛的接口
package multiex;
public interface Flyable {
public void fly();
}
二、會唱歌的接口
package multiex;
public interface Singable {
public void sing();
}
三、鳥的接口
鳥的接口繼承上面兩個接口
package multiex;
//雖然這個接口沒有定義方法,但是會繼承下來兩個方法
public interface Bird extends Flyable,Singable {
}
四、鸚鵡類,實現(xiàn)鳥接口
package multiex;
//鸚鵡類
public class Swallow implements Bird {
@Override
public void fly() {
System.out.println("鸚鵡會飛");
}
@Override
public void sing() {
System.out.println("鸚鵡會唱歌");
}
}
五、測試類
package multiex;
public class Main {
public static void main(String[] args) {
Swallow swallow = new Swallow();
swallow.fly();
swallow.sing();
}
}
運行結(jié)果:
上面演示了接口的多繼承,那么這里存在一個問題。如果多個接口中有重名的方法怎么辦?比如如下:
package multiex;
interface A {
void m();
}
//注意:方法返回值不一樣
interface B {
int m();
}
class C implements A, B {
public void m() {
System.out.println("void m()");
}
public int m() {
System.out.println("int m()");
}
}
public class Test {
public static void main(String[] args) {
C c1 = new C();
c1.m();
}
}
這時,編譯將無法通過。如下圖所示:
因為在Java中,
方法名+參數(shù)(不含返回值類型)唯一確定一個方法。
方法名+參數(shù)(不含返回值類型)唯一確定一個方法。
方法名+參數(shù)(不含返回值類型)唯一確定一個方法。
所以當返回值不同時,Java認為這還是同一個方法,會與其中一個接口的返回類型沖突。導(dǎo)致編譯錯誤。
同理,當返回值相同時,那這完全就是同一個方法了,實現(xiàn)類實現(xiàn)一次這個方法就好了。如下圖:
通過本文的實例講解,相信小伙伴們已經(jīng)徹底搞清楚了Java接口多繼承,也知道了Java接口多繼承和Java類單繼承的差別。想要掌握更多的Java接口知識,本站的Java接口教程是你的不二選擇,海量高質(zhì)量Java接口知識點羅列清晰,幫你查漏補缺!
初級 202925
初級 203221
初級 202629
初級 203743