Java為什麼不支援多繼承? 發布於 2 年前 (2017年10月30日) - 1210 次檢閱
- 2020 年 4 月 9 日
- 筆記
Java為什麼不支援多繼承?這個問題其實真的挺簡單。
我們可以先舉一個多重繼承錯誤的例子,我們定義一個動物(類)既是狗(父類1)也是貓(父類2),兩個父類都有「叫」這個方法。那麼當我們調用「叫」這個方法時,它就不知道是狗叫還是貓叫了,這就是多重繼承的衝突。
package com.glj.demo1; public class Cat { public void say(){ System.out.println("this is Cat say!"); } } ------------------------------ package com.glj.demo1; public class Dog { public void say(){ System.out.println("this is dog say!"); } } ---------------------------------------------------- package com.glj.demo1; public class CatAndDog extends Dog,Cat{ public static void main(String[] args) { this.say();//這裡是貓叫呢還是狗叫呢? } }所以,如果你需要弄一個既要有貓叫又要有狗叫的什麼鬼動物來的話,那麼只需要創造一個描述這類行為的介面,然後在自己的類裡面實現這個行為的介面,最終就能實現所謂的行為來了....
因此,Java支援介面的多繼承,不支援類的多繼承,Java不支援類的多繼承的一個原因是避免實現方法的版本衝突
所以需要實現多繼承,那麼就是下面的
多介面+組合=多繼承
下面我們實現一個多繼承的例子,即一個介面people類,裡面有一個say方法和一個work的行為方法,再有一個Chinese介面類和American介面類去繼承了people的介面,然後二者結婚生下了一個中美的混血兒..ChandAm類...
package com.glj.demo; public interface People { public abstract void say(); public abstract void work(); } --------------------------------------- package com.glj.demo; public interface American extends People{ @Override public void say(); @Override public void work(); } --------------------------------------- package com.glj.demo; public interface Chinese extends People{ @Override public void say(); @Override public void work(); } --------------------------------------- package com.glj.demo; public class ChandAm implements Chinese,American{ @Override public void say() { // TODO Auto-generated method stub System.out.println("我是中美的混血兒"); } @Override public void work() { // TODO Auto-generated method stub System.out.println("我會打太極"); } } ----------------------------------------------- package com.glj.demo; public class Test { public static void main(String[] args) { ChandAm cna = new ChandAm(); cna.say();//我是中美的混血兒 cna.work();//我會打太極 } }所以,從上面的例子不難發現,Java其實是支援多繼承的,具體為:
- Java中的介面支援多繼承(介面與介面之間為繼承關係),因為介面不提供具體實現方式,只是一種規範,所以支援。
- Java的類是支援多介面的實現。
- Java的類是不支援多繼承的,原因是Java是強類型語言,多繼承會導致調用的不確定性,所以Java的類不支援。