为什么可以在抽象类中实现接口,而不能在其他接口中实现?

时间:2018-09-05 15:54:28

标签: java

  

我知道一个接口不能在另一个接口中实现   实现意味着编写方法的主体。这不能是   在接口中完成,因为接口中的任何方法都不会   身体。 {最多Java 7}

但是我很困惑,如果这就是为什么接口不能彼此实现的原因,那么为什么接口可以在抽象类中实现。由于抽象类不能必然定义接口的所有方法。因此,以某种方式,抽象类无法实现接口的所有方法。

4 个答案:

答案 0 :(得分:3)

接口不能使用implements,因为它们的目的是定义接口而不提供实现。 (不过,它们可以extend其他接口。)类的目的是提供实现,即使只是部分实现。

但是,就像几乎所有规则一样,边缘是模糊的:

  • 抽象类实际上不需要执行任何操作。
  • 现在Java接口具有默认方法,从某种意义上讲,它们可以实现一个接口,只是不使用关键字implements

    interface A {
        void foo();
    }
    interface B extends A {
        void bar();
        default void foo() {
            System.out.println("foo");
        }
    }
    
    public class Example implements B
    {
        public static void main(String[] args) throws Exception {
            new Example().foo();
        }
    
        public void bar() {
        }
    }
    
  • 通常,人们不会费心定义与类不同的接口,而是同时使用类来定义与其的接口,而 则提供了该类的实现。 (一些纯粹主义者对此有疑问,但这是非常普遍的做法。)

但是,从根本上讲:接口用于定义接口,而类用于提供实现。

答案 1 :(得分:3)

首先:“这不能在接口中完成,因为接口中的任何方法都没有主体。” :重要的是要注意,这有点过时了。接口可以具有方法实现/主体(默认和/或静态方法)。从Java 8开始,这是可能的。

  

为什么可以在抽象类中实现接口,但不能在其他接口中实现?

您的问题可能完全与implements关键字声明有关,因为这是唯一起作用的方面。从这个意义上讲,这是设计问题。抽象类是类,接口是接口。这两种类型的组件之间存在差异,在这种情况下,最值得注意的是具体类不能从多个抽象类继承。 关于抽象类和接口(例如this)之间的区别,SO上有很好的答案。

但是,从概念上讲,一个接口可以extends另一个接口,然后使用default方法为每个继承的抽象方法提供一个实现。有人可能会说这是超级接口的一种实现。但是当涉及到语言的细节时,只有一个类(无论是否抽象)都可以向implement声明一个接口。

但是,最后,无论具体方法是在接口中还是在抽象类中,在使用它们之前,都必须创建具体类的对象(在此我不包括功能接口),因此差别并不重要。

答案 2 :(得分:1)

接口可以扩展其他接口。 至于抽象类:它们要求接口方法在实现后就立即实现。但是,实现不必在抽象类中,而仅在扩展抽象类且本身不是抽象的类中。

答案 3 :(得分:1)

您必须了解一些内容。 接口实现类,抽象类是一个类。从Java文档

  

接口只能由类实现或由其他扩展   接口。

那为什么接口不能实现另一个接口?

因为在您实现类时,您正在定义类的行为。因此,将接口实现为另一个接口将破坏接口的用途。实现定义了您需要方法的实现,并且接口不仅仅具有类。