大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學習攻略 Java8有什么新特性,讓我們學學接口的變化

Java8有什么新特性,讓我們學學接口的變化

更新時間:2020-06-04 16:28:02 來源:動力節點 瀏覽2519次

接口的變化

在Java8之前,Java中,實現接口的類必須為接口中定義的每個方法提供一個實現,或者從父類中繼承它的實現。

但是,一旦類庫的設計者需要更新接口,向其中加入新的方法,這種方式就會出現問題。

現實情況是,現存的實體類往往不在接口設計者的控制范圍之內,這些實體類為了適配新的接口約定也需要進行修改。

由于Java 8的API在現存的接口上引入了非常多的新方法,這種變化帶來的問題也愈加嚴重。

Java 8為了解決這一問題引入了一種新的機制。

Java 8中的接口現在支持在聲明方法的同時提供實現,這聽起來讓人驚訝!通過兩種方式可以完成這種操作。

其一,Java 8允許在接口內聲明靜態方法。

其二,Java 8引入了一個新功能,叫默認方法。

接口的默認方法

通過默認方法你可以指定接口方法的默認實現。因此,實現接口的類如果不實現該方法,就會自動繼承默認的實現。這種機制可以使你平滑地進行接口的優化和演進。

那么,我們該如何辨識哪些是默認方法呢?非常簡單。默認方法由default修飾符修飾,并像類中聲明的其他方法一樣包含方法體。

Java 8中,大量的默認方法已經被添加到核心的JDK接口中了.

示例:

Java8有什么新特性,讓我們學學接口的變化

Defaulable接口用關鍵字default聲明了一個默認方法notRequired()。

Defaulable接口的實現者之一DefaultableImpl實現了這個接口,并且讓默認方法保持原樣。

Defaulable接口的另一個實現者OverridableImpl用自己的方法覆蓋了默認方法。

注意:接口不能提供對Object類的任何方法的默認實現。特別是,這意味著從接口里不能提供對equals,hashCode或toString的默認實現。

接口的靜態方法

Java 8帶來的另一個有趣的特性是接口可以聲明并且可以提供實現靜態方法。例如:

private interface DefaulableFactory{

在JVM中,默認方法的實現是非常高效的,并且通過字節碼指令為方法調用提供了支持。

默認方法允許繼續使用現有的Java接口,而同時能夠保障正常的編譯過程。

這方面好的例子是大量的方法被添加到java.util.Collection接口中去:stream(),parallelStream(),forEach(),removeIf(),……

解決沖突的規則

我們知道Java語言中一個類只能繼承一個父類,但是一個類可以實現多個接口。

隨著默認方法在Java 8中引入,有可能出現一個類繼承了多個方法而它們使用的卻是同樣的函數簽名。

這種情況下,類會選擇使用哪一個函數?在實際情況中,像這樣的沖突可能極少發生,但是一旦發生這樣的狀況,必須要有一套規則來確定按照什么樣的約定處理這些沖突。

假設有以下幾個接口:

Java8有什么新特性,讓我們學學接口的變化

解決問題的三條規則

如果一個類使用相同的函數簽名從多個地方(比如另一個類或接口)繼承了方法,通過三條規則可以進行判斷。

(1)類中的方法優先級最高。類或父類中聲明的方法的優先級高于任何聲明為默認方法的優先級。

(2)如果無法依據第一條進行判斷,那么子接口的優先級更高:函數簽名相同時,優先選擇擁有最具體實現的默認方法的接口,即如果B繼承了A,那么B就比A更加具體。

(3)最后,如果還是無法判斷,繼承了多個接口的類必須通過顯式覆蓋和調用期望的方法。否則將不能編譯通過。

依據此規則,上面的示例將會使用B接口中的方法。

沖突及如何顯式地消除歧義

前面的例子能夠應用前兩條判斷規則解決。讓我們更進一步,假設B不再繼承A呢?

Java8有什么新特性,讓我們學學接口的變化

這時規則(2)就無法進行判斷了,因為從編譯器的角度看沒有哪一個接口的實現更加具體,兩個都差不多。A接口和B接口的hello方法都是有效的選項。所以,Java編譯器這時就會拋出一個編譯錯誤,因為它無法判斷哪一個方法更合適。

沖突的解決

解決這種兩個可能的有效方法之間的沖突,沒有太多方案;你只能顯式地決定你希望在C中使用哪一個方法。

為了達到這個目的,你可以覆蓋類C中的hello方法,在它的方法體內顯式地調用你希望調用的方法。

Java 8中引入了一種新的語法X.super.m(...),其中X是你希望調用的m方法所在的父接口。

舉例來說,如果你希望C使用來自于B的默認方法,它的調用方式看起來就如下所示:

public class C implements B,A{
void hello(){
B.super.hello();
}
}

顯式地選擇調用接口B中的方法

盡管默認方法非常強大,但是在使用默認方法時我們需要小心注意一個地方:在聲明一個默認方法前,請仔細思考是不是真的有必要使用默認方法,因為默認方法會帶給程序歧義,并且在復雜的繼承體系中容易產生編譯錯誤。

Java8有什么新特性,讓我們學學接口的變化

以上就是動力節點java培訓機構的小編針對“Java8有什么新特性,讓我們學學接口的變化”的內容進行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業老師隨時為你服務。

提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 亚洲在线观看 | 日本一区二区在线视频 | 国内自拍 在线播放 网红 | 色婷婷久久合月综 | 欧美成成人免费 | 久久9966精品国产免费 | 思思91精品国产综合在线 | 日本精品久久久久中文字幕 | 色婷婷777| 国产在线视精品麻豆 | 国产精品久久久久久久久久久久 | 国产国产精品人在线观看 | 高清国产一区二区三区 | 亚洲欧美中日韩中文字幕 | 4hu四虎永久免在线视看 | 综合网视频| 日本毛片在线观看 | 国产a国产 | 全免费一级毛片在线播放 | 91尤物在线播放 | 久久国产乱子伦精品免费一 | 欧美成人禁片在线www | 欧美日韩精品一区二区三区 | 亚洲美女免费视频 | 成人亚洲性情网站www在线观看 | 国产精品久久亚洲不卡动漫 | 久久中文字幕视频 | 99精品视频在线观看re | 国产一区二区精品久久岳 | 国产高清狼人香蕉在线观看 | 国产在视频线精品www666 | 久久精品网址 | 国内精品久久久久影院亚洲 | 日本免费高清一区 | 日韩精品一区二区三区中文精品 | 四虎精品免费永久在线 | 中文字幕热久久久久久久 | 中文字幕日韩精品一区口 | 欧美一级大片在线观看 | 在线看片a| 毛片毛片毛片毛片毛片毛片毛片 |