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
因此,基本上,接口中默认方法和静态方法之间的差异与类中的静态方法和实例方法之间的差异相同。
添加回答
举报