Java抽象类和接口

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

如果我可以将Abstract类模拟为Interface,为什么java提供了Interface?

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

任何人都可以简要解释一下。

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

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

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

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

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

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

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

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

回答

1)java中的多个inheritance是通过接口实现的。

2)如果存在需要对方法进行一些解释但不是完全成熟的方法的情况,最好的方法是使用抽象类。

3)接口仅为返回类型和参数类型提供协议