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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java 8 接口

發(fā)布時(shí)間:2024/4/13 java 90 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java 8 接口 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Java8 之前的接口定義中,方法的方法體必須是空的,接口不允許定義實(shí)例變量。并且接口實(shí)現(xiàn)類必須實(shí)現(xiàn)接口定義的所有方法。從Java 8 開始,接口可以定義默認(rèn)方法,而且所有接口實(shí)現(xiàn)類都可以改方法及實(shí)現(xiàn)。

默認(rèn)方法和抽象方法的區(qū)別是抽象方法必須要被實(shí)現(xiàn),默認(rèn)方法不是。作為替代方式,接口可以提供一個(gè)默認(rèn)的方法實(shí)現(xiàn),所有這個(gè)接口的實(shí)現(xiàn)類都會(huì)通過繼承得到這個(gè)方法(如果有需要也可以重寫這個(gè)方法)

默認(rèn)方法定義

public interface DefaultFuncInter {
??? int getInt();
??? default String getString(){
??????? return "Default String";
??? }
}

默認(rèn)方法優(yōu)勢

  • 提供一種拓展接口的方法,而不破壞現(xiàn)有代碼。

假如我們有一個(gè)已經(jīng)投入使用的接口需要拓展一個(gè)新的方法,在JDK8以前,如果為一個(gè)使用的接口增加一個(gè)新方法,則我們必須在所有實(shí)現(xiàn)類中添加該方法的實(shí)現(xiàn),否則編譯會(huì)出現(xiàn)異常。如果實(shí)現(xiàn)類數(shù)量少并且我們有權(quán)限修改,可能會(huì)工作量相對(duì)較少。如果實(shí)現(xiàn)類比較多或者我們沒有權(quán)限修改實(shí)現(xiàn)類源代碼,這樣可能就比較麻煩。而默認(rèn)方法則解決了這個(gè)問題,它提供了一個(gè)實(shí)現(xiàn),當(dāng)沒有顯示提供其他實(shí)現(xiàn)時(shí)就采用這個(gè)實(shí)現(xiàn)。這樣新添加的方法將不會(huì)破壞現(xiàn)有代碼。

注意:擴(kuò)展方法不能夠重寫(也稱復(fù)寫或覆蓋) Object 中的方法,卻可以重載Object 中的方法。

  • 默認(rèn)方法是可選的,子類可以根據(jù)不同的需求Override默認(rèn)實(shí)現(xiàn)。

例如,我們定義一個(gè)集合接口,其中有增、刪、改等操作。如果我們的實(shí)現(xiàn)類90%都是以數(shù)組保存數(shù)據(jù),那么我們可以定義針對(duì)這些方法給出默認(rèn)實(shí)現(xiàn),而對(duì)于其他非數(shù)組集合或者有其他類似業(yè)務(wù),可以選擇性復(fù)寫接口中默認(rèn)方法。

多重繼承的沖突說明:

由于同一個(gè)方法可以從不同接口引入,自然而然的會(huì)有沖突的現(xiàn)象,規(guī)則如下:

1)一個(gè)聲明在類里面的方法優(yōu)先于任何默認(rèn)方法

2)優(yōu)先選取最具體的實(shí)現(xiàn)

3)如果繼承多個(gè)同名的默認(rèn)方法,則必須在類中重寫默認(rèn)方法,提高優(yōu)先級(jí)。

接口靜態(tài)方法

Java8接口中可以定義靜態(tài)方法,只能通過接口名調(diào)用,不可以通過實(shí)現(xiàn)類的類名或者實(shí)現(xiàn)類的對(duì)象調(diào)用。類似類的靜態(tài)方法。

public interface DefaultFuncInter {
??? int getInt();
??? static int add(int a,int b){
??????? return a + b;
??? }
}

由于靜態(tài)方法只能通過接口來類來調(diào)用,所以不會(huì)出現(xiàn)多個(gè)接口的相同方法沖突的問題。

函數(shù)式接口

Java8開始支持Lambda表達(dá)式,一個(gè)lambda表達(dá)式都對(duì)應(yīng)一個(gè)類型,通常是接口類型。而“函數(shù)式接口”是指僅僅只包含一個(gè)抽象方法的接口,每一個(gè)該類型的lambda表達(dá)式都會(huì)被匹配到這個(gè)抽象方法。因?yàn)?默認(rèn)方法 不算抽象方法,所以你也可以給你的函數(shù)式接口添加默認(rèn)方法。

@FunctionalInterface
interface Converter<F, T> {
??? T convert(F from);
}
Converter<String, Integer> converter = (from) -> Integer.valueOf(from);
Integer converted = converter.convert("123");
System.out.println(converted);??? // 123
?

邏輯與 符號(hào)

public static <K extends Comparable<? super K>, V> Comparator<Map.Entry<K,V>> comparingByKey() {return (Comparator<Map.Entry<K, V>> & Serializable)(c1, c2) -> c1.getKey().compareTo(c2.getKey());}

& 表示lambda表達(dá)式是可以轉(zhuǎn)換成的對(duì)象,可以滿足2個(gè)接口

總結(jié)

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

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