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

大卫说恢复莫妮卡:

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

那是什么

据我所知,唯一剩下的区别(也许是一些效率方面的东西)是抽象类遵循传统的Java单继承,而接口可以具有多重继承(如果愿意的话,也可以是多重实现)。这使我想到另一个问题-

新的Java 8接口如何避免出现菱形问题

Skiwi:

接口不能具有与它们关联的状态。

抽象类可以具有与它们关联的状态。

此外,不需要在接口中实现默认方法。因此,以这种方式,它不会破坏现有的代码,因为当接口确实收到更新时,实现类无需实现它。
结果,您可能会得到次优的代码,但是如果您想拥有更多的最优代码,那么您的工作就是覆盖默认实现。

最后,万一发生钻石问题,编译器会警告您,需要选择要实现的接口。

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

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Java 8 及更高版本中的抽象类和接口之间有什么区别?

接口和Java 8中抽象类之间的根本区别

接口和抽象类之间有什么区别?

C ++概念和Java接口之间有什么区别?

C结构和Java类之间有什么区别?

Java的BufferedReader和InputStreamReader类之间有什么区别?

Swift 2.0协议扩展和Java / C#抽象类之间有区别吗?

Java 8 lambda和带有抽象类的接口扩展

动态调用-具有接口和抽象类的Java

Scala(和Java)中的类和类型之间有什么区别?

Java的8接口VS抽象类

Java中的类导入和包导入之间有什么区别?

Java API中的“ Class”类和“ class”关键字之间有什么区别?

Java-抽象类和接口

Java接口和抽象类问题

Java抽象类和接口

Java 8中的map()和flatMap()方法之间有什么区别?

java中this和this()之间有什么区别

Java中的Object和Object之间有什么区别

Java中的Array和Arrays类有什么区别?

类包装器和Java和Objective-C中的单例之间有什么区别?

Java枚举和具有私有构造函数的类之间有什么区别?

从jdk-8开始的Java标准库中是否有使用抽象类与接口的示例?

Java中的&和&&有什么区别?

!=和=!有什么区别?在Java中?

静态接口与Java中没有此类关键字的常规接口之间有什么区别?

Java和闭包之间的匿名类有什么区别?

java类文件版本之间有什么区别

Java 15的密封类功能中的final类和非密封类有什么区别?