为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

料青山看我应如是 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 关注
  • 69 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信