Java抽象类和接口

Java abstract class and interface

本问题已经有最佳答案,请猛点这里访问。

在采访中,我被问到以下问题。我试图回答这个问题,但我想得到这个问题的确切答案。

如果我能模拟抽象类作为接口,为什么Java提供了接口?

这意味着如果在抽象类中,我可以将所有方法标记为抽象的,那么抽象类将作为接口工作,所以我为什么需要接口。

有人能简单地给我解释一下吗?


这是一个非常标准的面试问题。答案是:因为您可以实现多个接口,但不能扩展多个抽象类。

JRE中的例子:LinkedList既是List又是Deque。这些接口定义类的行为。它们不提供任何实现细节。而抽象类可以提供一些。

相关问题:这个和这个。后者不是直接相关的,但它显示了为什么需要接口,即使在抽象类足够的情况下也是如此。


接口定义契约,可以定义常量,但不提供所有契约方法的实现。

抽象类可以提供方法和成员变量的实现——如果需要,可以创建一个抽象类,它定义除具体子类中需要的微调之外的所有内容。不能对接口执行此操作,但可以实现多个接口,并且只能扩展一个父类。

这两个接口和抽象类都可以用于多态地使用具体的类。


抽象类可以很好地设置默认方法和层次结构。问题是子类只能一次性扩展超类。另一方面,接口可以相互扩展多次,子类可以实现任意数量的接口。这提供了很大的灵活性,并提供了改变的潜力。理想情况下,可以组合,即抽象类实现Interface1…Interface2,这是两个世界中最好的。


回答

1)通过接口实现Java中的多重继承。

2)如果有一种情况需要对一个方法进行某种解释,但不是完全成熟的方法,那么最好的方法是使用抽象类。

3)接口只提供返回类型和参数类型的协议。


面试官问这个问题的原因是因为你的答案反映了你对编程语言(和编译器)的深刻理解。特别是,Java定义了(纯)抽象类之上的接口的概念,以便(部分地)支持多重继承(介于接口之间)。如果没有引入这个机制,我们将无法实现某种类型的多重继承,或者在C++中由完全成熟的多重继承所造成的巨大混乱。