亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么會選擇在接口中使用靜態方法而不是默認方法

為什么會選擇在接口中使用靜態方法而不是默認方法

料青山看我應如是 2022-08-17 15:55:43
首先,在您嘗試解釋什么是接口以及靜態和默認方法之前,我不建議這樣做,因為這不是問題所在。我還想解決的是,這不是與抽象/默認方法之間的差異或什么是抽象/默認方法有關的問題的重復。這不是問題所在。因此,在接口中,您可以擁有默認方法和靜態方法。兩者都有一個實現。兩者都可以在實現接口的類中使用。我看到的主要區別是靜態方法不能通過對象運行,而默認方法是通過對象運行的。但是,它們都有實現,并且不是“實例”,因為實現接口的相同類型的兩個對象沒有位于接口內部的實例變量...因為接口變量都是靜態的和最終的。因此,因為唯一的主要區別是,一個可以通過對象運行,而另一個只能通過類運行......然而,他們做同樣的事情,為什么要用靜態方法打擾。在類中,可以通過對象實例調用靜態方法。在接口中,您不能。默認似乎只是有一個額外的功能,那么為什么選擇使用靜態而不是默認值呢?-謝謝
查看完整描述

1 回答

?
慕森卡

TA貢獻1806條經驗 獲得超8個贊

但是,它們都有實現,并且不是“實例”,因為實現接口的相同類型的兩個對象沒有位于接口內部的實例變量...因為接口變量都是靜態的和最終的。


不,你弄錯了。默認方法委托給抽象方法。抽象方法在實現接口的具體類中實現。具體類非常具有實例字段。


例:


interface Counter {

    void add(int i);

    default void increment() {

       this.add(1);

    }

}

實現


class ConcreteCounter implements Counter {

    private int value = 0;


    @Override 

    public void add(int i) {

        this.value += i;

    }

}

靜態方法與類中的靜態方法一樣,不能調用實例方法,而是在接口類本身上調用,而不是在此接口的實例上調用。在上面的示例中,例如,您可以


interface Counter {

    static Counter createDefault() {

        return new ConcreteCounter();

    }


    void add(int i);

    default void increment() {

       this.add(1);

    }

}

此靜態方法不可能作為默認方法實現:必須創建計數器才能創建計數器是沒有意義的。


舉一個更具體的例子,讓我們以接口的方法為例。它對列表的元素進行排序,并且是默認方法。它不可能是靜態方法:靜態方法不是在 List 的實例上調用的,因此它不可能對其元素進行排序。sort()List


因此,基本上,接口中默認方法和靜態方法之間的差異與類中的靜態方法和實例方法之間的差異相同。


查看完整回答
反對 回復 2022-08-17
  • 1 回答
  • 0 關注
  • 86 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號