1. 程式人生 > >Java介面default方法思考鑽石問題

Java介面default方法思考鑽石問題

在多種程式語言中,都會有父類子類的繼承關係,但是多繼承會存在如下的鑽石問題。

來看看鑽石:

假如A有一個介面,B,C都有自己的實現,那麼繼承B和C的D,D的例項賦值給A的引用呼叫這個介面該返回什麼?

由於這種情況下類繼承圖的形狀,它被稱為“鑽石問題”。在這種情況下,A類位於頂部,B和C分別位於其下方,D將兩者連線在一起形成菱形。

對於Java類不支援多繼承,所以不存在這樣的問題,至於C++,這麼寫的時候好像是不能通過編譯的。

但是在Java8之後,介面中引入了default和static方法,介面是支援多繼承的,所以可能就會存在這樣的問題,編譯執行不報錯,但結果不是很好理解。比如下面的示例,你覺得執行的是哪一個m方法呢?

當然按照菱形的我可以寫個這樣的

在每一個接口裡面都有 default void show()方法,那麼下面的將會輸出什麼?為什麼是它?

參考:

https://www.quora.com/What-is-the-diamond-problem-in-programming

https://en.wikipedia.org/wiki/Multiple_inheritance