Java8新特性之接口中的默認(rèn)方法和靜態(tài)方法詳解
一、前言
Java 8 引入了默認(rèn)方法以及可以在接口中定義的靜態(tài)方法。
默認(rèn)方法是一個(gè)普通的 java 方法,但以 default 關(guān)鍵字開頭,靜態(tài)方法像往常一樣用 static 關(guān)鍵字聲明。
二、為什么在 Java 接口中使用默認(rèn)方法?
為什么java在接口中引入了默認(rèn)方法。
假設(shè)一個(gè)拖拉機(jī)制造公司發(fā)布了操作拖拉機(jī)的標(biāo)準(zhǔn)接口,如如何掛擋或停車等。
開發(fā)者已經(jīng)開發(fā)了不同類型的拖拉機(jī)來實(shí)現(xiàn)標(biāo)準(zhǔn)的拖拉機(jī)接口。
如果公司在其標(biāo)準(zhǔn)接口中增加了新的功能,如如何跳動(dòng)拖拉機(jī)?
開發(fā)者需要對他們的類進(jìn)行修改以定義新的方法,這不是一個(gè)好辦法。
現(xiàn)在我們需要默認(rèn)方法來處理這種情況,以避免重寫所有實(shí)現(xiàn)標(biāo)準(zhǔn)拖拉機(jī)接口的類。
在接口中定義默認(rèn)方法,它將在所有實(shí)現(xiàn)拖拉機(jī)接口的類中可用。
三、為什么在 Java 接口中使用靜態(tài)方法?
從 Java 8 開始,接口可以具有靜態(tài)方法。
靜態(tài)方法與類相關(guān)聯(lián),而不與對象相關(guān)聯(lián)。靜態(tài)方法用作輔助方法。
所以如果我們在接口中聲明靜態(tài)方法,我們很容易組織我們的輔助方法。
四、場景一:接口中的默認(rèn)方法
為了理解使用默認(rèn)方法,我創(chuàng)建了一個(gè)接口 Village,它有一些方法聲明和一個(gè)默認(rèn)方法。
默認(rèn)方法以 default 關(guān)鍵字開頭。
默認(rèn)情況下,接口的所有方法都是公共的,因此無需使用 public 關(guān)鍵字來聲明和定義接口中的方法。
Village.java
public interface Village {
void setNumOfPeople(int num);
void setName(String name);
default String getBusinessType(){
return "Most of the Village people do Farming";
}
}
創(chuàng)建一個(gè)將實(shí)現(xiàn) Village 接口的 Location 類。
默認(rèn)方法將自動(dòng)在此類中可用。
Location.java
public class Location implements Village {
public int noOfPeople;
public String name;
@Override
public void setNumOfPeople(int n){
this.noOfPeople = n;
}
@Override
public void setName(String name){
this.name = name;
}
}
為了測試這個(gè)方案,創(chuàng)建一個(gè)Main類并通過Location對象訪問默認(rèn)方法。
Main.java
public class Main {
public static void main(String[] args){
Location lo = new Location();
System.out.println(lo.getBusinessType());
}
}
輸出
Most of the Village people do Farming
五、場景二:接口中的靜態(tài)方法
現(xiàn)在我們也可以在接口中編寫靜態(tài)方法。在我們的Village接口中,我已經(jīng)將getVillageId()聲明為一個(gè)靜態(tài)方法。
這個(gè)靜態(tài)方法也可以在默認(rèn)方法中被訪問。
public interface Village {
void setNumOfPeople(int num);
void setName(String name);
static int getVillageId(){
return 1;
}
default String getBusinessType(){
return "Business type is Farming and village id:"+getVillageId();
}
}
我對Location類做一些修改,以使用靜態(tài)方法。
我們可以通過接口名稱來使用靜態(tài)方法。
public class Location implements Village {
public int noOfPeople;
public String name;
@Override
public void setNumOfPeople(int n){
this.noOfPeople = n;
}
@Override
public void setName(String name){
this.name = name;
}
public int getLocationId(){
return Village.getVillageId();
}
Main.java
public class Main {
public static void main(String[] args){
Location lo = new Location();
System.out.println(lo.getBusinessType());
System.out.println("Village id:"+Village.getVillageId());
System.out.println("Location Id:"+lo.getLocationId());
}
}
輸出
Business type is Farming and village id:1
Village id:1
Location Id:1
六、情景三:多重繼承 - 在兩個(gè)接口中使用相同名稱的默認(rèn)方法
在多重繼承的情況下,一個(gè)類實(shí)現(xiàn)了不止一個(gè)接口,我們需要檢查默認(rèn)方法的行為方式。
現(xiàn)在我正在創(chuàng)建一個(gè)包含getBusinessType()默認(rèn)方法的接口。
City.java
public interface City {
void setName(String name);
void setArea(int area);
default String getBusinessType(){
return "Service";
}
}
對于多重繼承,Location類將同時(shí)實(shí)現(xiàn)Village和City接口。
由于Village和City都包含同名的缺省方法,所以由于存在歧義,Location類將強(qiáng)制在類中明確定義缺省方法。
除非我們定義一個(gè)與默認(rèn)方法同名的方法,否則Location類將不會(huì)被編譯。
Location.java
public class Location implements Village, City {
public int noOfPeople;
public String name;
public int area;
@Override
public void setNumOfPeople(int n){
this.noOfPeople = n;
}
@Override
public void setName(String name){
this.name = name;
}
@Override
public void setArea(int area){
this.area = area;
}
@Override
public String getBusinessType(){
return "People do business like Farming and Service.";
}
public int getLocationId(){
return Village.getVillageId();
}
}
輸出
People do business like Farming and Service.
Village id:1
Location Id:1
七、參考文獻(xiàn)
【1】Java 8 Default and Static Method in Interface
到此這篇關(guān)于Java8新特性之接口中的默認(rèn)方法和靜態(tài)方法詳解的文章就介紹到這了,更多相關(guān)Java默認(rèn)方法和靜態(tài)方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java通過SSH連接路由器輸入命令并讀取響應(yīng)的操作方法
最近需要讀取和修改華為路由器的配置,使用Java語言開發(fā),通過SSH連接,輸入命令并讀取響應(yīng),接下來通過本文給大家介紹下Java通過SSH連接路由器,輸入命令并讀取響應(yīng),需要的朋友可以參考下2024-01-01
Java控制臺(tái)版五子棋的簡單實(shí)現(xiàn)方法
這篇文章主要給大家介紹了關(guān)于Java控制臺(tái)版五子棋的簡單實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
SpringBoot3整合Swagger3時(shí)出現(xiàn)Type javax.servlet.http.H的ttpSe
這篇文章主要介紹了SpringBoot3整合Swagger3時(shí)出現(xiàn)Type javax.servlet.http.H的ttpServletRequest not present錯(cuò)誤解決方法,文中有詳細(xì)的解決方法,需要的朋友可以參考下2025-01-01
List轉(zhuǎn)變?yōu)槎禾柗指舻腟tring(Java7和Java8分別實(shí)現(xiàn))
這篇文章主要介紹了Java7和Java8分別實(shí)現(xiàn)List轉(zhuǎn)變?yōu)槎禾柗指舻腟tring,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
java如何通過Kerberos認(rèn)證方式連接hive
該文主要介紹了如何在數(shù)據(jù)源管理功能中適配不同數(shù)據(jù)源(如MySQL、PostgreSQL和Hive),特別是如何在SpringBoot3框架下通過Kerberos認(rèn)證與Hive進(jìn)行安全交互,文章詳細(xì)描述了Kerberos認(rèn)證過程,包括配置krb5.conf和keytab文件、處理Hadoop和Hive版本兼容性問題2025-02-02

