多重繼承指的是一個類可以同時從多於一個的父類那裡繼承行為和特征,然而我們知道Java為了保證數據安全,它只允許單繼承。有些時候我們會認為如果系統中需要使用多重繼承往往都是糟糕的設計,這個時候我們往往需要思考的不是怎麼使用多重繼承,而是您的設計是否存在問題.但有時候我們確實是需要實現多重繼承,而且現實生活中也真正地存在這樣的情況,比如遺傳:我們即繼承了父親的行為和特征也繼承了母親的行為和特征。可幸的是Java是非常和善和理解我們的,它提供了兩種方式讓我們曲折來實現多重繼承:接口和內部類。
在介紹接口和抽象類的時候了解到子類只能繼承一個父類,也就是說只能存在單一繼承,但是卻可以實現多個接口,這就為我們實現多重繼承做了鋪墊。
對於接口而已,有時候它所表現的不僅僅只是一個更純粹的抽象類,接口是沒有任何具體實現的,也就是說,沒有任何與接口相關的存儲,因此也就無法阻止多個接口的組合了。
1 interface CanFight { 2 void fight(); 3 } 4 5 interface CanSwim { 6 void swim(); 7 } 8 9 10 interface CanFly { 11 void fly(); 12 } 13 14 public class ActionCharacter { 15 public void fight(){ 16 17 } 18 } 19 20 public class Hero extends ActionCharacter implements CanFight,CanFly,CanSwim{ 21 22 public void fly() { 23 } 24 25 public void swim() { 26 } 27 28 /** 29 * 對於fight()方法,繼承父類的,所以不需要顯示聲明 30 */ 31 }
上面使用接口實現多重繼承是一種比較可行和普遍的方式,在介紹內部類的時候談到內部類使的多繼承的實現變得更加完美了,同時也明確了如果父類為抽象類或者具體類,那麼我就僅能通過內部類來實現多重繼承了。如何利用內部類實現多重繼承,請看下面實例:兒子是如何利用多重繼承來繼承父親和母親的優良基因。
首先是父親Father和母親Mother:
public class Father { public int strong(){ return 9; } } public class Mother { public int kind(){ return 8; } }
重頭戲在這裡,兒子類Son:
public class Son { /** * 內部類繼承Father類 */ class Father_1 extends Father{ public int strong(){ return super.strong() + 1; } } class Mother_1 extends Mother{ public int kind(){ return super.kind() - 2; } } public int getStrong(){ return new Father_1().strong(); } public int getKind(){ return new Mother_1().kind(); } }
測試程序:
public class Test1 { public static void main(String[] args) { Son son = new Son(); System.out.println("Son 的Strong:" + son.getStrong()); System.out.println("Son 的kind:" + son.getKind()); } } ---------------------------------------- Output: Son 的Strong:10 Son 的kind:6
兒子繼承了父親,變得比父親更加強壯,同時也繼承了母親,只不過溫柔指數下降了。這裡定義了兩個內部類,他們分別繼承父親Father類、母親類Mother類,且都可以非常自然地獲取各自父類的行為,這是內部類一個重要的特性:內部類可以繼承一個與外部類無關的類,保證了內部類的獨立性,正是基於這一點,多重繼承才會成為可能。
參考文章鏈接:java提高篇(九)—–實現多重繼承