Java 为什么会选择在接口中使用静态方法而不是默认方法

Java 为什么会选择在接口中使用静态方法而不是默认方法,java,interface,static,default,Java,Interface,Static,Default,首先,在您试图解释什么是接口以及静态和默认方法之前,我不建议您这样做,因为这不是问题所在。我还想指出的是,这不是与抽象/默认方法之间的区别或什么是抽象/默认方法有关的问题的重复。这不是问题所在 因此,在接口中,可以有默认方法和静态方法。两者都有一个实现。两者都可以在实现接口的类中使用。我看到的主要区别是静态方法不能通过对象运行,而默认方法是。但是,它们都有实现,并且不是“实例”,因为实现接口的同一类型的两个对象在接口内部没有实例变量。。。因为接口变量都是静态的和最终的 所以,因为唯一的主要区别是

首先,在您试图解释什么是接口以及静态和默认方法之前,我不建议您这样做,因为这不是问题所在。我还想指出的是,这不是与抽象/默认方法之间的区别或什么是抽象/默认方法有关的问题的重复。这不是问题所在

因此,在接口中,可以有默认方法和静态方法。两者都有一个实现。两者都可以在实现接口的类中使用。我看到的主要区别是静态方法不能通过对象运行,而默认方法是。但是,它们都有实现,并且不是“实例”,因为实现接口的同一类型的两个对象在接口内部没有实例变量。。。因为接口变量都是静态的和最终的

所以,因为唯一的主要区别是一个可以通过对象运行,而另一个只能通过类运行。。。但是它们做的事情是一样的,为什么还要用静态方法呢。在类中,可以通过对象实例调用静态方法。在接口中,您不能。默认值似乎只有一个附加功能,那么为什么选择使用静态值而不是默认值呢

-谢谢

但是,它们都有实现,并且不是“实例”,因为实现接口的同一类型的两个对象在接口内部没有实例变量。。。因为接口变量都是静态的和最终的

不,你搞错了。默认方法委托给抽象方法。抽象方法在实现接口的具体类中实现。具体类非常具有实例字段

例如:

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.sort(List x);?使其静止。另外,这是否意味着默认方法是实例方法?无法通过()调用;?并使用他们所使用的静力学。此静态方法位于Collections类中:
Collections.sort(list,comparator)
。将其作为列表中的默认方法允许执行
List.sort(comparator)
,这比
List.sort(List,comparator)
直观得多。那么可以说默认方法类似于父类实例方法吗?我还编辑了我的第一条评论。是的,你可以这么说。不过,它们不能像类中的方法一样是final。