Java8新特性之接口中的默認(rèn)方法和靜態(tài)方法詳解
一、前言
Java 8 引入了默認(rèn)方法以及可以在接口中定義的靜態(tài)方法。
默認(rèn)方法是一個(gè)普通的 java
方法,但以 default
關(guān)鍵字開(kāi)頭,靜態(tài)方法像往常一樣用 static
關(guān)鍵字聲明。
二、為什么在 Java 接口中使用默認(rèn)方法?
為什么java
在接口中引入了默認(rèn)方法。
假設(shè)一個(gè)拖拉機(jī)制造公司發(fā)布了操作拖拉機(jī)的標(biāo)準(zhǔn)接口,如如何掛擋或停車等。
開(kāi)發(fā)者已經(jīng)開(kāi)發(fā)了不同類型的拖拉機(jī)來(lái)實(shí)現(xiàn)標(biāo)準(zhǔn)的拖拉機(jī)接口。
如果公司在其標(biāo)準(zhǔn)接口中增加了新的功能,如如何跳動(dòng)拖拉機(jī)?
開(kāi)發(fā)者需要對(duì)他們的類進(jìn)行修改以定義新的方法,這不是一個(gè)好辦法。
現(xiàn)在我們需要默認(rèn)方法來(lái)處理這種情況,以避免重寫所有實(shí)現(xiàn)標(biāo)準(zhǔn)拖拉機(jī)接口的類。
在接口中定義默認(rèn)方法,它將在所有實(shí)現(xiàn)拖拉機(jī)接口的類中可用。
三、為什么在 Java 接口中使用靜態(tài)方法?
從 Java 8
開(kāi)始,接口可以具有靜態(tài)方法。
靜態(tài)方法與類相關(guān)聯(lián),而不與對(duì)象相關(guān)聯(lián)。靜態(tài)方法用作輔助方法。
所以如果我們?cè)诮涌谥新暶黛o態(tài)方法,我們很容易組織我們的輔助方法。
四、場(chǎng)景一:接口中的默認(rèn)方法
為了理解使用默認(rèn)方法,我創(chuàng)建了一個(gè)接口 Village
,它有一些方法聲明和一個(gè)默認(rèn)方法。
默認(rèn)方法以 default
關(guān)鍵字開(kāi)頭。
默認(rèn)情況下,接口的所有方法都是公共的,因此無(wú)需使用 public
關(guān)鍵字來(lái)聲明和定義接口中的方法。
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; } }
為了測(cè)試這個(gè)方案,創(chuàng)建一個(gè)Main
類并通過(guò)Location
對(duì)象訪問(wèn)默認(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
五、場(chǎng)景二:接口中的靜態(tài)方法
現(xiàn)在我們也可以在接口中編寫靜態(tài)方法。在我們的Village
接口中,我已經(jīng)將getVillageId()
聲明為一個(gè)靜態(tài)方法。
這個(gè)靜態(tài)方法也可以在默認(rèn)方法中被訪問(wè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(); } }
我對(duì)Location
類做一些修改,以使用靜態(tài)方法。
我們可以通過(guò)接口名稱來(lá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"; } }
對(duì)于多重繼承,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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring?invokeBeanFactoryPostProcessors方法刨析源碼
invokeBeanFactoryPostProcessors該方法會(huì)實(shí)例化所有BeanDefinitionRegistryPostProcessor和BeanFactoryPostProcessor的實(shí)例并且執(zhí)行postProcessBeanFactory與postProcessBeanDefinitionRegistry方法2023-01-01詳細(xì)解讀Druid數(shù)據(jù)庫(kù)連接池的使用
這篇文章主要介紹了Druid數(shù)據(jù)庫(kù)連接池的使用,數(shù)據(jù)庫(kù)連接池負(fù)責(zé)分配、管理和釋放數(shù)據(jù)庫(kù)連接,它允許應(yīng)用程序重復(fù)使用一個(gè)現(xiàn)有的數(shù)據(jù)庫(kù)連接,而不是重新建立一個(gè),需要的朋友可以參考下2023-03-03java中l(wèi)ist使用時(shí)需避免的場(chǎng)景總結(jié)
眾所周知,Java為開(kāi)發(fā)者提供了多種集合類的實(shí)現(xiàn),其中幾乎所有業(yè)務(wù)代碼都需要用到List,但List的錯(cuò)誤使用也會(huì)導(dǎo)致諸多問(wèn)題,所以本文我們就來(lái)看一看幾個(gè)錯(cuò)誤使用List的場(chǎng)景吧2023-10-10java并發(fā)數(shù)據(jù)包Exchanger線程間的數(shù)據(jù)交換器
這篇文章主要為大家介紹了java并發(fā)數(shù)據(jù)包使用數(shù)據(jù)交換器Exchanger來(lái)進(jìn)行線程之間的數(shù)據(jù)交換。有需要的朋友可以借鑒參考下,希望能夠有所幫助2022-03-03SpringBoot整合Mybatis的知識(shí)點(diǎn)匯總
在本篇文章里小編給各位整理的是關(guān)于SpringBoot整合Mybatis的知識(shí)點(diǎn)匯總,有興趣學(xué)習(xí)的參考下。2020-02-02Java實(shí)現(xiàn)非阻塞式服務(wù)器的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何利用Java實(shí)現(xiàn)一個(gè)簡(jiǎn)單的非阻塞式服務(wù)器,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,需要的可以參考一下2023-05-05