Java8新特性之接口中的默認方法和靜態(tài)方法詳解
一、前言
Java 8 引入了默認方法以及可以在接口中定義的靜態(tài)方法。
默認方法是一個普通的 java
方法,但以 default
關(guān)鍵字開頭,靜態(tài)方法像往常一樣用 static
關(guān)鍵字聲明。
二、為什么在 Java 接口中使用默認方法?
為什么java
在接口中引入了默認方法。
假設(shè)一個拖拉機制造公司發(fā)布了操作拖拉機的標準接口,如如何掛擋或停車等。
開發(fā)者已經(jīng)開發(fā)了不同類型的拖拉機來實現(xiàn)標準的拖拉機接口。
如果公司在其標準接口中增加了新的功能,如如何跳動拖拉機?
開發(fā)者需要對他們的類進行修改以定義新的方法,這不是一個好辦法。
現(xiàn)在我們需要默認方法來處理這種情況,以避免重寫所有實現(xiàn)標準拖拉機接口的類。
在接口中定義默認方法,它將在所有實現(xiàn)拖拉機接口的類中可用。
三、為什么在 Java 接口中使用靜態(tài)方法?
從 Java 8
開始,接口可以具有靜態(tài)方法。
靜態(tài)方法與類相關(guān)聯(lián),而不與對象相關(guān)聯(lián)。靜態(tài)方法用作輔助方法。
所以如果我們在接口中聲明靜態(tài)方法,我們很容易組織我們的輔助方法。
四、場景一:接口中的默認方法
為了理解使用默認方法,我創(chuàng)建了一個接口 Village
,它有一些方法聲明和一個默認方法。
默認方法以 default
關(guā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)建一個將實現(xiàn) Village
接口的 Location
類。
默認方法將自動在此類中可用。
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; } }
為了測試這個方案,創(chuàng)建一個Main
類并通過Location
對象訪問默認方法。
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()
聲明為一個靜態(tài)方法。
這個靜態(tài)方法也可以在默認方法中被訪問。
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
六、情景三:多重繼承 - 在兩個接口中使用相同名稱的默認方法
在多重繼承的情況下,一個類實現(xiàn)了不止一個接口,我們需要檢查默認方法的行為方式。
現(xiàn)在我正在創(chuàng)建一個包含getBusinessType()
默認方法的接口。
City.java
public interface City { void setName(String name); void setArea(int area); default String getBusinessType(){ return "Service"; } }
對于多重繼承,Location
類將同時實現(xiàn)Village
和City
接口。
由于Village
和City
都包含同名的缺省方法,所以由于存在歧義,Location
類將強制在類中明確定義缺省方法。
除非我們定義一個與默認方法同名的方法,否則Location
類將不會被編譯。
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
七、參考文獻
【1】Java 8 Default and Static Method in Interface
到此這篇關(guān)于Java8新特性之接口中的默認方法和靜態(tài)方法詳解的文章就介紹到這了,更多相關(guān)Java默認方法和靜態(tài)方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring?invokeBeanFactoryPostProcessors方法刨析源碼
invokeBeanFactoryPostProcessors該方法會實例化所有BeanDefinitionRegistryPostProcessor和BeanFactoryPostProcessor的實例并且執(zhí)行postProcessBeanFactory與postProcessBeanDefinitionRegistry方法2023-01-01java中l(wèi)ist使用時需避免的場景總結(jié)
眾所周知,Java為開發(fā)者提供了多種集合類的實現(xiàn),其中幾乎所有業(yè)務代碼都需要用到List,但List的錯誤使用也會導致諸多問題,所以本文我們就來看一看幾個錯誤使用List的場景吧2023-10-10java并發(fā)數(shù)據(jù)包Exchanger線程間的數(shù)據(jù)交換器
這篇文章主要為大家介紹了java并發(fā)數(shù)據(jù)包使用數(shù)據(jù)交換器Exchanger來進行線程之間的數(shù)據(jù)交換。有需要的朋友可以借鑒參考下,希望能夠有所幫助2022-03-03