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

时间:2019-03-17 15:43:32

标签: java interface static default

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

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

因此,因为唯一的主要区别是一个对象可通过对象运行,而一个对象只能通过类运行...但是它们却做同样的事情,为什么还要麻烦静态方法。在类中,您可以通过对象实例调用静态方法。在界面中,您不能。默认似乎只是具有附加功能,所以为什么选择使用静态而不是默认?

-谢谢

1 个答案:

答案 0 :(得分:3)

  

但是,它们都具有实现,并且在实现接口的相同类型的两个对象没有位于接口内部的实例变量的意义上,它们不是“实例” ...因为接口变量都是静态的,最终。

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

示例:

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);
    }
}

此静态方法可能无法实现为默认方法: 为了能够创建计数器而必须创建一个Counter并没有任何意义。

举一个更具体的例子,让我们以sort()接口的List方法为例。它对列表中的元素进行排序,并且是默认方法。它不可能是静态方法:静态方法不会在List的实例上调用,因此它不可能对元素进行排序。

因此,基本上,接口中的默认方法和静态方法之间的区别与类中的静态方法和实例方法之间的区别相同。