日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

接口默认方法

發(fā)布時間:2025/3/15 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 接口默认方法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、JAVA接口基礎(chǔ)

  • 接口定義
  • 在JAVA中,接口的作用主要是定義該類型實例具有的功能,也就是定義必須執(zhí)行那些工作,而不關(guān)心如何進行這些工作。所以,在接口中定義的方法沒有方法體,并且接口不允許定義實例變量。以下代碼中定義名為MyInterface的接口,并且在該接口中定義了getInt方法,如果有類實現(xiàn)了該接口,則根據(jù)JAVA語法,該類必須實現(xiàn)getInt方法。

    public interface MyInterface{int getInt(); }
  • 使用接口的優(yōu)勢
    接口的設(shè)計主要是為了支持運行時動態(tài)方法解析。通常情況下,為了能夠從一個類中調(diào)用另外一個類的方法,在編譯時這兩個類都需要存在,進而使Java編譯器能夠進行檢查以確保方法簽名是兼容的。這個要求本身造成了一個靜態(tài)的并且是不可擴展的類系統(tǒng)。設(shè)計接口的目的就是為了皮面這種問題。具體參考代碼:
  • public interface MyInterface{int getInt(); } public class MyInterfaceImpl implements MyInterface{@Overridepublic int getInt(){return 6;} } public class MyInterfaceImpl1 implements MyInterface{@Overridepublic int getInt(){return 6;} } public classMain{public static void main(String[] args){MyInterface my = null;// 根據(jù)工廠或者其他方式獲取MyInterfaceImpl或者MyInterfaceImpl1的實例my.getInt();} }

    在上述代碼示例中,如果用工廠模式或者其他創(chuàng)建對象的方式,在編譯期間,編譯器無確定當前“my”對象示例的實現(xiàn)類是哪一個,但是也不會拋出異常。只有在運行期,創(chuàng)建對應(yīng)實例時,才可以確定當前“my”對象的確切類型。這樣,就可以更好的實現(xiàn)多態(tài)的特性。(這個環(huán)節(jié)中涉及到向上轉(zhuǎn)型,如果有讀者對向上轉(zhuǎn)型或者向下轉(zhuǎn)型有疑問,可以查看相關(guān)博客或者文檔)

    二、接口與抽象類

    類與接口最大的兩個區(qū)別就是:

  • 類中可以定義成員變量,但是接口中不允許存在成員變量,接口中的變量隱式加了static final
  • 接口中所有方法都具體實現(xiàn),也就是實現(xiàn)為空(JAVA8中這種定義是正確的,但是JAVA8以后,增加了默認實現(xiàn))但是有一種類比較特殊,那就是抽象類,抽象類中可以定義成員變量,也可以像接口一樣定義抽象方法,由子類去完成方法細節(jié)。如果一個類只是實現(xiàn)了接口中的部分方法定義,那么該類必須聲明為抽象類。這種編程模式經(jīng)常被使用。如:Spring的AbstractBeanFactory間接的實現(xiàn)了BeanFactory以及其他接口中通用功能,其他方法交由后續(xù)子類實現(xiàn)。在我們實際開發(fā)中,也經(jīng)常會針對Service以及Dao做一個抽象接口,然后開發(fā)一個抽象類,將通用功能實現(xiàn),例如dao中的增刪改查翻頁等,對于業(yè)務(wù)特有內(nèi)容,則交由后續(xù)子類實現(xiàn)。
  • 三、JAVA 接口默認方法方法

    在JDK8之前,接口不能定義任何實現(xiàn),這意味著之前所有的JAVA版本中,接口制定的方法是抽象的,不包含方法體。從JKD8開始,添加了一種新功能-默認方法。默認方法允許接口方法定義默認實現(xiàn),而所有子類都將擁有該方法及實現(xiàn)。

    public interface DefaultFuncInter {int getInt();default String getString(){return "Default String";}//默認方法可以有多個default String getString1(){return "Default String1";} }
  • 默認方法的優(yōu)勢
    • 默認方法的主要優(yōu)勢是提供一種拓展接口的方法,而不破壞現(xiàn)有代碼。加入我們有一個已經(jīng)投入使用接口需要拓展一個新的方法,在JDK8以前,如果為一個使用的接口增加一個新方法,則我們必須在所有實現(xiàn)類中添加該方法的實現(xiàn),否則編譯會出現(xiàn)異常。如果實現(xiàn)類數(shù)量少并且我們有權(quán)限修改,可能會工作量相對較少。如果實現(xiàn)類比較多或者我們沒有權(quán)限修改實現(xiàn)類源代碼,這樣可能就比較麻煩。而默認方法則解決了這個問題,它提供了一個實現(xiàn),當沒有顯示提供其他實現(xiàn)時就采用這個實現(xiàn)。這樣新添加的方法將不會破壞現(xiàn)有代碼。
    • 默認方法的另一個優(yōu)勢是該方法是可選的,子類可以根據(jù)不同的需求Override默認實現(xiàn)。例如,我們定義一個集合接口,其中有增、刪、改等操作。如果我們的實現(xiàn)類90%都是以數(shù)組保存數(shù)據(jù),那么我們可以定義針對這些方法給出默認實現(xiàn),而對于其他非數(shù)組集合或者有其他類似業(yè)務(wù),可以選擇性復(fù)寫接口中默認方法。(由于接口不允許有成員變量,所以本示例旨在說明默認方法的優(yōu)勢,并不具有生產(chǎn)可能性)

    具體參照如下代碼:

    /*** 定義接口,并包含默認實現(xiàn)方法*/public interface CollectionDemoInter {//增加默認實現(xiàn)default void addOneObj(Object object){System.out.println("default add");}//刪除默認實現(xiàn)default void delOneObj(Object object){System.out.println("default del");}//更新默認實現(xiàn)default void updateOneObj(Object object){System.out.println("default del");}//接口定義需要實現(xiàn)方法String showMsg(); } /*** 基于數(shù)組的集合實現(xiàn)類,增刪改使用默認方法 */ 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");} }

    通過上述代碼,大家可以很清楚的發(fā)現(xiàn),如果在接口中定義默認方法,則子類不需要必須實現(xiàn)該默認實現(xiàn),如果有特殊需求或者需要,則可以O(shè)verride該實現(xiàn)。還有一種情形,如果一個類實現(xiàn)兩個或兩個以上接口,并且多個接口中包含統(tǒng)一默認方法,此時,編譯器將報錯。這種情況,我們必須讓子類Override該方法,否則無法編譯通過。

    文章轉(zhuǎn)自

    總結(jié)

    以上是生活随笔為你收集整理的接口默认方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。