Java中接口的多继承
我們知道Java的類只能繼承一個類,但可以實現多個接口。但是你知道么?Java中的接口卻可以繼承多個接口。本文就來說一說Java中接口的多繼承。
進入主題之前,先擴展一下。Java為什么只支持單繼承呢?
我們不妨假設Java支持多繼承,舉個例子,在這里有個A類,我們又編寫了兩個類B類和C類,并且B類和C類分別繼承了A類,并且對A類的同一個方法進行了覆蓋。如果此時我們再次編寫了一個D類,并且D類以多繼承的方式同時集成了B類和C類,那么D類也會繼承B類和C類從A類中重載的方法,如下圖所示。那么問題來了,D類也開始犯迷糊了,我到底應該哪個繼承哪個類中的方法呢,因為類是結構性的,這樣就會造成結構上的混亂。這就是多繼承的菱形繼承問題。
同時我們知道C++是支持多繼承的,因為它解決了這個問題(我對C++不太熟,查了下資料,好像是通過虛基類實現的吧)。但是Java本著簡單的原則,舍棄了多繼承。
好,進入正題。我們還是舉個實例來演示一下接口的多繼承。
燕子是鳥,鳥會飛,也會唱歌。我們來模仿一下:
一、會飛的接口
package multiex;public interface Flyable {public void fly(); }二、會唱歌的接口
package multiex;public interface Singable {public void sing(); }三、鳥的接口
鳥的接口繼承上面兩個接口
四、燕子類,實現鳥接口
package multiex;//燕子類 public class Swallow implements Bird {@Overridepublic void fly() {System.out.println("燕子會飛");}@Overridepublic void sing() {System.out.println("燕子會唱歌");} }五、測試類
package multiex;public class Main {public static void main(String[] args) {Swallow swallow = new Swallow();swallow.fly();swallow.sing();} }運行結果:
上面演示了接口的多繼承,那么這里存在一個問題。如果多個接口中有重名的方法怎么辦?比如如下:
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中,
方法名+參數(不含返回值類型)唯一確定一個方法。
方法名+參數(不含返回值類型)唯一確定一個方法。
方法名+參數(不含返回值類型)唯一確定一個方法。
所以當返回值不同時,Java認為這還是同一個方法,會與其中一個接口的返回類型沖突。導致編譯錯誤。
同理,當返回值相同時,那這完全就是同一個方法了,實現類實現一次這個方法就好了。如下圖:
怎么樣?同學你懂了沒?
?
作者:小北覓
鏈接:https://www.jianshu.com/p/017f1a6d6fd9
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權并注明出處。
總結
以上是生活随笔為你收集整理的Java中接口的多继承的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 10年前美国GDP占世界总量超23%,中
- 下一篇: 第一次办信用卡必须柜台激活吗