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
因此,基本上,接口中默認方法和靜態方法之間的差異與類中的靜態方法和實例方法之間的差異相同。
添加回答
舉報