接口不能具有与它们关联的状态。
抽象类可以具有与它们关联的状态。
此外,不需要在接口中实现默认方法。因此,以这种方式,它不会破坏现有的代码,因为当接口确实收到更新时,实现类无需实现它。
结果,您可能会得到次优的代码,但是如果您想拥有更多的最优代码,那么您的工作就是覆盖默认实现。
最后,万一发生钻石问题,编译器会警告您,您需要选择要实现的接口。
要显示有关钻石问题的更多信息,请考虑以下代码:
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
以便可以将播放器添加到例如播放器列表中。
可是等等...?
如何存储玩家列表?
答案是,即使您具有默认的可用实现,也无法在界面中执行此操作。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句