接口默认方法
一、JAVA接口基礎
在JAVA中,接口的作用主要是定義該類型實例具有的功能,也就是定義必須執行那些工作,而不關心如何進行這些工作。所以,在接口中定義的方法沒有方法體,并且接口不允許定義實例變量。以下代碼中定義名為MyInterface的接口,并且在該接口中定義了getInt方法,如果有類實現了該接口,則根據JAVA語法,該類必須實現getInt方法。
public interface MyInterface{int getInt(); }接口的設計主要是為了支持運行時動態方法解析。通常情況下,為了能夠從一個類中調用另外一個類的方法,在編譯時這兩個類都需要存在,進而使Java編譯器能夠進行檢查以確保方法簽名是兼容的。這個要求本身造成了一個靜態的并且是不可擴展的類系統。設計接口的目的就是為了皮面這種問題。具體參考代碼:
在上述代碼示例中,如果用工廠模式或者其他創建對象的方式,在編譯期間,編譯器無確定當前“my”對象示例的實現類是哪一個,但是也不會拋出異常。只有在運行期,創建對應實例時,才可以確定當前“my”對象的確切類型。這樣,就可以更好的實現多態的特性。(這個環節中涉及到向上轉型,如果有讀者對向上轉型或者向下轉型有疑問,可以查看相關博客或者文檔)
二、接口與抽象類
類與接口最大的兩個區別就是:
三、JAVA 接口默認方法方法
在JDK8之前,接口不能定義任何實現,這意味著之前所有的JAVA版本中,接口制定的方法是抽象的,不包含方法體。從JKD8開始,添加了一種新功能-默認方法。默認方法允許接口方法定義默認實現,而所有子類都將擁有該方法及實現。
public interface DefaultFuncInter {int getInt();default String getString(){return "Default String";}//默認方法可以有多個default String getString1(){return "Default String1";} }- 默認方法的主要優勢是提供一種拓展接口的方法,而不破壞現有代碼。加入我們有一個已經投入使用接口需要拓展一個新的方法,在JDK8以前,如果為一個使用的接口增加一個新方法,則我們必須在所有實現類中添加該方法的實現,否則編譯會出現異常。如果實現類數量少并且我們有權限修改,可能會工作量相對較少。如果實現類比較多或者我們沒有權限修改實現類源代碼,這樣可能就比較麻煩。而默認方法則解決了這個問題,它提供了一個實現,當沒有顯示提供其他實現時就采用這個實現。這樣新添加的方法將不會破壞現有代碼。
- 默認方法的另一個優勢是該方法是可選的,子類可以根據不同的需求Override默認實現。例如,我們定義一個集合接口,其中有增、刪、改等操作。如果我們的實現類90%都是以數組保存數據,那么我們可以定義針對這些方法給出默認實現,而對于其他非數組集合或者有其他類似業務,可以選擇性復寫接口中默認方法。(由于接口不允許有成員變量,所以本示例旨在說明默認方法的優勢,并不具有生產可能性)
具體參照如下代碼:
/*** 定義接口,并包含默認實現方法*/public interface CollectionDemoInter {//增加默認實現default void addOneObj(Object object){System.out.println("default add");}//刪除默認實現default void delOneObj(Object object){System.out.println("default del");}//更新默認實現default void updateOneObj(Object object){System.out.println("default del");}//接口定義需要實現方法String showMsg(); } /*** 基于數組的集合實現類,增刪改使用默認方法 */ public class Collection4Array implements CollectionDemoInter {@Overridepublic String showMsg() {return null;} } /*** 特殊集合,不允許刪除元素*/ public class NodelCollection implements CollectionDemoInter {@Overridepublic String showMsg() {return null;}//重寫delOneObj@Overridepublic void delOneObj(Object object){System.out.println("none del");} }通過上述代碼,大家可以很清楚的發現,如果在接口中定義默認方法,則子類不需要必須實現該默認實現,如果有特殊需求或者需要,則可以Override該實現。還有一種情形,如果一個類實現兩個或兩個以上接口,并且多個接口中包含統一默認方法,此時,編譯器將報錯。這種情況,我們必須讓子類Override該方法,否則無法編譯通過。
文章轉自
總結
- 上一篇: 2021抖音电商生态发展报告
- 下一篇: Servlet规范