溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java8新特性之接口中默認方法和靜態(tài)方法的示例分析

發(fā)布時間:2021-06-10 09:20:21 來源:億速云 閱讀:172 作者:小新 欄目:開發(fā)技術

這篇文章給大家分享的是有關Java8新特性之接口中默認方法和靜態(tài)方法的示例分析的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

一、前言

Java 8 引入了默認方法以及可以在接口中定義的靜態(tài)方法。

默認方法是一個普通的 java 方法,但以 default 關鍵字開頭,靜態(tài)方法像往常一樣用 static 關鍵字聲明。

二、為什么在 Java 接口中使用默認方法?

為什么java在接口中引入了默認方法。

假設一個拖拉機制造公司發(fā)布了操作拖拉機的標準接口,如如何掛擋或停車等。

開發(fā)者已經開發(fā)了不同類型的拖拉機來實現標準的拖拉機接口。

如果公司在其標準接口中增加了新的功能,如如何跳動拖拉機?

開發(fā)者需要對他們的類進行修改以定義新的方法,這不是一個好辦法。

現在我們需要默認方法來處理這種情況,以避免重寫所有實現標準拖拉機接口的類。

在接口中定義默認方法,它將在所有實現拖拉機接口的類中可用。

三、為什么在 Java 接口中使用靜態(tài)方法?

Java 8 開始,接口可以具有靜態(tài)方法。

靜態(tài)方法與類相關聯,而不與對象相關聯。靜態(tài)方法用作輔助方法。

所以如果我們在接口中聲明靜態(tài)方法,我們很容易組織我們的輔助方法。

四、場景一:接口中的默認方法

為了理解使用默認方法,我創(chuàng)建了一個接口 Village,它有一些方法聲明和一個默認方法。

默認方法以 default 關鍵字開頭。

默認情況下,接口的所有方法都是公共的,因此無需使用 public 關鍵字來聲明和定義接口中的方法。

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)建一個將實現 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)方法

現在我們也可以在接口中編寫靜態(tài)方法。在我們的Village接口中,我已經將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

六、情景三:多重繼承 - 在兩個接口中使用相同名稱的默認方法

在多重繼承的情況下,一個類實現了不止一個接口,我們需要檢查默認方法的行為方式。

現在我正在創(chuàng)建一個包含getBusinessType()默認方法的接口。

City.java

public interface City {
    void setName(String name);
    void setArea(int area);
    default String getBusinessType(){
        return "Service";
    }
}

對于多重繼承,Location類將同時實現VillageCity接口。

由于VillageCity都包含同名的缺省方法,所以由于存在歧義,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

感謝各位的閱讀!關于“Java8新特性之接口中默認方法和靜態(tài)方法的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI