gpt4 book ai didi

java - Java 8 中的抽象类和接口(interface)有什么区别?

转载 作者:IT老高 更新时间:2023-10-28 13:52:49 26 4
gpt4 key购买 nike

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

那是什么?

据我所知,唯一剩下的区别(可能除了一些底层效率的东西)是抽象类遵循传统的 Java 单继承,而接口(interface)可以有多重继承(如果你愿意,也可以有多重实现) )。这让我想到另一个问题 -

新的 Java 8 接口(interface)如何避免 diamond Problem ?

最佳答案

接口(interface)不能有与之关联的状态。

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

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

最后,如果出现菱形问题,编译器会警告你,需要选择你想要实现的接口(interface)。

要显示有关菱形问题的更多信息,请考虑以下代码:

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 继承了 method() 表单类型 B 和 C 的不相关默认值

解决方法是:

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

如果我想从 B 继承 method()
如果 Dclass 也是如此。

要进一步了解 Java 8 中接口(interface)和抽象类之间的区别,请考虑以下团队:

interface Player {

}

interface Team {
void addPlayer(Player player);
}

理论上,您可以提供 addPlayer 的默认实现,以便您可以将玩家添加到例如玩家列表中。
但是等等……?
如何存储玩家列表?
答案是你不能在接口(interface)中这样做,即使你有可用的默认实现。

关于java - Java 8 中的抽象类和接口(interface)有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22591499/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com