Java 8中的抽象类和接口有什么区别?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (44)

在Java中,抽象类和接口之间有一个微妙而重要的区别:默认实现。抽象类可以拥有它们,接口不能。虽然Java 8引入了接口的默认实现,这意味着这不再是接口和抽象类之间的关键区别。

那是什么?

尽我所知,唯一剩下的差别(除了可能在抽象效率之下的一些东西),抽象类遵循传统的Java单一继承,而接口可以具有多重继承(如果愿意,也可以是多重实现)。这导致我另一个问题 -

新的Java 8接口如何避免diamond Problem

提问于
用户回答回答于

接口不能有与之相关的状态。

抽象类可以有与之相关的状态。

此外,接口中的默认方法不需要实现。所以通过这种方式,它不会破坏已经存在的代码,因为在接口获得更新时,实现类不需要实现它。 因此,您可能会得到不理想的代码,但如果您想要更优化的代码,那么您的工作就是覆盖默认实现。

最后,如果钻石问题发生,编译器会警告你,将需要选择你想要实现的接口。

要显示钻石问题的更多信息,请考虑以下代码:

interface A {
    void method();
}

interface B extends A {
    @Override
    default void method() {
        System.out.println("B");
    }
}

interface C extends A { 
    @Override
    default void method() {
        System.out.println("C");
    }
}

interface D extends B, C {

}

在这里我得到编译器错误interface D extends B, C,那:

interface D inherits unrelated defaults for method() form types B and C

解决方法是:

interface D extends B, C {
    @Override
    default void method() {
        B.super.method();
    }
}

如果我想继承method()B。 如果D是的话也是一样class

要更多地了解Java 8中的接口和抽象类之间的区别,请考虑以下内容Team

interface Player {

}

interface Team {
    void addPlayer(Player player);
}

理论上addPlayer,你可以提供一个默认实现,例如你可以添加玩家到一个玩家列表。 可是等等...? 我如何储存玩家名单? 答案是,即使您有可用的默认实现,您也无法在界面中执行此操作。

用户回答回答于

已经有一些非常详细的解答,但他们似乎丢失了一个点,我至少认为是极少数理由之一有抽象类

抽象类可以拥有受保护的成员(以及具有默认可见性的成员)。接口中的方法是隐式公开的

扫码关注云+社区