一文講通Java為什么不支持多繼承原理
正文
首先,思考這么一種場景,假如現(xiàn)在A類繼承了B類和C類,并且B類和C類中,都存在test()方法,那么當(dāng)A類對象調(diào)用test()方法時,該調(diào)用B類的test()呢?還是C類的test()呢?是沒有答案的,所以Java中不允許多繼承。
但是,Java中接口是可以多繼承的,比如:
public interface A { void test(); } public interface B { void test(); } public interface C extends A, B{ }
為什么接口可以?
因為都是A、B、C都是接口,就算A、B兩個接口中都定義了test方法,因為接口中只是聲明了方法,并沒有真正實現(xiàn)方法,所以對于C接口而言并不會照成困擾,對于C接口而言它只是繼承了同一個test()方法的聲明而已,在使用時需要C接口的實現(xiàn)類來實現(xiàn)這個test()方法就可以了。
public class C1 implements C{ public void test() { System.out.println("hello Hoeller"); } }
那么接口中不是有default方法嗎?那不是也可以在接口中來實現(xiàn)方法嗎?
我們直接來測試一下:
public interface A { default void test() { System.out.println("a"); } } public interface B { default void test() { System.out.println("b"); } } public interface C extends A, B{ }
此時C接口會編譯報錯,報錯信息為:
com.hoeller.C inherits unrelated defaults for test() from types com.hoeller.A and com.hoeller.B
翻不翻譯都無所謂了,反正就是報錯了,表示C接口不能同時繼承兩個接口中default方法test()。
如果你問,那為什么C++中可以支持多繼承,那得解釋菱形繼承、虛繼承,本文就不分析了(因為我也不知道)。
以上就是一文講通Java為什么不支持多繼承原理的詳細內(nèi)容,更多關(guān)于Java不支持多繼承的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringBoot增強Controller方法@ControllerAdvice注解的使用詳解
這篇文章主要介紹了SpringBoot增強Controller方法@ControllerAdvice注解的使用詳解,@ControllerAdvice,是Spring3.2提供的新注解,它是一個Controller增強器,可對controller進行增強處理,需要的朋友可以參考下2023-10-10在 Spring Boot 項目中實現(xiàn)文件下載功能
這篇文章主要介紹了在 Spring Boot 項目中實現(xiàn)文件下載功能,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-09-09