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
相關推薦
Java介面default方法思考鑽石問題
在多種程式語言中,都會有父類子類的繼承關係,但是多繼承會存在如下的鑽石問題。 來看看鑽石: 假如A有一個介面,B,C都有自己的實現,那麼繼承B和C的D,D的例項賦值給A的引用呼叫這個介面該返回什麼? 由於這種情況下類繼承圖的形狀,它被稱為“鑽石問題”。在這種情況
Java介面———工廠方法設計模式
介面是實現多重繼承的途徑,而生成遵循某個介面的物件的典型方法就是工廠方法設計模式。工廠方法與直接呼叫構造器不同,直接呼叫構造器,會導致物件的生成與物件的使用耦合性太強,使得程式碼不夠靈活,而工廠方法則能夠很好的使兩者分離。而且工廠方法將完全和介面實現分離,這樣也
Java——介面測試方法
正文 剛開始做java專案時小菜有過這樣的疑惑,現在大部分的java專案都是前後端分離,以前不分離的時候測試自己所做的介面都是直接啟動介面輸入資料打斷點等進行除錯,那現在前後端分離了,後端介面寫好
[BIT0429]-Java 介面作方法形參,執行時傳遞實現介面方法類物件作實參
1.定義介面表示某個行為(如:吃飯) 2.定義多個實現該介面的類 3.定義一個方法,以該介面作為形參,執行時以實現該介面的任意類的物件作為實參 4.達到精簡程式碼的目的,並且可複用性好,可維護性高
Java - 一個類實現的多個介面,有相同簽名的default方法會怎麼辦
Java - 一個類實現的多個介面,有相同簽名的default方法會怎麼辦 public interface A { default void hello() { System.out.println("Hello from A"); }
java 介面中用private、protected、public、default和status修飾方法和變數
通常使用java 的介面時都是不帶修飾符的public interface Test { int a = 0; void test(); } 其實這個裡面有好多修飾符都是預設省略掉了。 正確的型別應該是: public interface Test { publ
java介面自動化3——POST請求方法封裝過程和測試
這個介面自動化測試框架到目前為止,我們已經完成了Get請求的封裝和必要的工具類的支援。接下來這篇,我來介紹如何完成POST請求的封裝過程。一般來說,在一個專案中,介面測試很多時候就是測試Get和POST方法,其他的請求方式的介面很少,佔的比重幾乎不計。所以,這個Java介面自動化測試框架的核心就是G
java介面自動化2——get方法重構和json解析
我們介紹了Get方法的設計過程和測試結果,現在我們需要對前面程式碼進行重構和修改,本篇主要的工作如下 : 1)重構Get方法 2)如何進行JSON解析 3)使用TestNG方法進行測試斷言 1、重構Get方法 前面一篇寫的Get方法比較繁瑣,不光寫了如何進行Get請求
java介面自動化4——PUT和Delete請求方法封裝和測試
接著上面一篇,這篇來封裝下PUT和Delete方法。雖然這兩個方法很少用,這篇內容就算了解一下。PUT方法封裝完成參考POST方法,Delete方法封裝可以參考GET方法。由於弄明白了前面的Get和Post方法封裝過程,現在就直接貼出封裝方法和測試程式碼。 1.PUT和Deletet方法 p
java.util.List介面的方法subList()進行分頁查詢
java.util.List中有一個subList方法,用來返回一個list的一部分的檢視。 List<E> subList(int fromIndex, int toIndex);把list進行分頁,其中以pagesize為每頁資料的個數,然後從第一頁開始依次輸出每頁的資料直至
Java介面中的方法和常量
一、介面是: 介面就是給出一些沒有內容的方法,封裝到一起,到某個類要使用的時候,在根據具體情況把這些方法寫出來。 介面是更加抽象的抽象的類 :抽象類裡的方法可以有方法體,接口裡的所有方法都沒有方法體。介面體現了程式設計的多型和高內聚低偶合的設計思想。錯誤語法例:void a
Java呼叫https介面get方法,無證書
1.工具類 package springmvc.wx.controller.train; import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException;
java-函數語言程式設計-函式式介面以及方法應用
一、lambda表示式 1、 Lambda表示式是匿名內部類的簡化寫法。 Lambda標準格式: (引數型別 引數名) -> { 方法體; return 返回值; }
Java:函式式介面、方法引用
1、函式式介面-概念及格式 函式式介面:有且只有一個抽象方法的介面(可以有其他的方法:預設方法,靜態方法,私有方法…) 2、函式式介面[email protected]註解 1)、在定義函式式介面時,為防止發生定義錯誤,可使用@FunctionalIn
java呼叫介面的方法
package com.forming.sapinterface; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Pr
Java設計模式---裝飾者模式(用生活例子解釋通過裝飾類物件對方法進行實現介面的方法增強)
裝飾者模式可以動態地給一個物件新增一些額外的職責。 就增加功能來說,Decorator模式相比生成子類更為靈活。 該模式的適用環境為: (1)在不影響其他物件的情況下,以動態、透明的方式給單個物件新增職責。 (2)處理那些可以撤消的職責。 (3)當不能採用生成子
java基礎總結 -- 泛型 在類、介面、方法、匿名類、元組等使用 堆疊例子 商店模型
為什麼使用泛型: 在面向物件程式語言中,多型算是一種泛化機制。例如,你可以將方法的引數型別設為基類,那麼 該方法就可以接受從這個基類中匯出的任何類作為引數,這樣的方法更通用一些,可應用的地方也多一點。 在類的內部也是如此,凡是能夠使用基類,確實是能夠具備更好
java 泛型在類,介面和方法上的應用
雖然我在泛型的使用這塊,應用的地方不是很多,但是還是要總結一下的,這一篇文章主要是從使用的角度,對泛型進行介紹。 如果一個類有一個或者多個型別的變數,那麼這個類就是泛型類,這些型別變數是類的型別引數。下邊這個類是一個簡單的java類,有一個屬性t,它的型別是Object 方
java面向物件——介面與方法實現
介面與方法實現 關鍵字interface implements public interface Smoking { public abstract void smoke(); } public 
JAVA傳送http get/post請求,呼叫http介面、方法
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; impo