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

113

我的意思是:

interface B {...}

interface A extends B {...} // allowed  

interface A implements B {...} // not allowed

我谷歌搜索了一下,找到了这个网页:

implements 表示为接口的方法定义一个实现。然而,接口没有实现,所以这是不可能的。

然而,接口是一个100%抽象的类,一个抽象类可以实现接口(100%抽象的类)而不用实现它的方法。那么,当它被定义为“接口”时,有什么问题呢?

具体来说,

interface A {
    void methodA();
}

abstract class B implements A {} // we may not implement methodA() but allowed

class C extends B {
   void methodA(){}
} 

interface B implements A {} // not allowed. 
//however, interface B = %100 abstract class B
7个回答

120

implements 的意思是实现,而 interface 是指声明提供接口而不是实现。

一个 100% 的 abstract class 在功能上等同于一个 interface,但如果需要的话它也可以有实现(在这种情况下它就不会保持 100% 的抽象性),因此从 JVM 的角度来看,它们是不同的东西。

此外,在 100% 抽象类中的成员变量可以有任何访问限定符,在接口中它们隐含为 public static final


11
自Java 8起,接口可以拥有默认方法,这使得它们在这方面与抽象类更加相似。 - forresthopkinsa
5
谢谢你最后一句话! - Tao Zhang

25

implements 的意思是为 abstract 方法(除了抽象类,显然不包括)定义一种行为方式,你需要定义实现方式。

extends 则表示继承了一种行为方式。

在接口中,可以通过继承另一个接口来指定某个接口应具有与其相同的行为方式,甚至没有实际的实现。这就是为什么将接口扩展到另一个接口而不是实现它更有意义。


顺便提一下,即使抽象类可以定义抽象方法(就像接口那样),它仍然是一个,需要被继承(扩展),而不是实现。


4

从概念上讲,有两个“领域”类和接口。在这些领域中,您始终在扩展,只有一个类实现了一个接口,这有点像“越过边界”。因此,对于接口,“extends”反映了类的行为。至少我认为这是背后的逻辑。似乎并不是每个人都同意这种逻辑(我自己觉得有点牵强),事实上根本没有技术原因需要有两个不同的关键字。


如果“Y扩展X”并且未封闭,则可能有另一种类型“Z”扩展“Y”。这对于X是接口还是类都是正确的。然而,如果“W实现X”,则不可能有“V实现W”。 “extends”可以被“链接”,而“implements”不能似乎是使用不同关键字的好理由。 - supercat

2
希望这能帮助你,以下是我在大学期间学习面向对象编程(核心Java)所学到的一些内容。
实现(Implements)表示为接口方法定义一个实现。然而,接口没有实现,所以这是不可能的。但是,接口可以扩展另一个接口,这意味着它可以添加更多的方法并继承其类型。
下面是一个例子,这是我对此的理解以及在面向对象编程方面学到的知识。
interface ParentInterface{  
        void myMethod();  
}  

interface SubInterface extends ParentInterface{  
        void anotherMethod();  
}  

请记住,一个接口只能扩展另一个接口。如果您想在某个类中定义其功能,则只能实现接口,例如下面的示例:

public interface Dog
{
    public boolean Barks();

    public boolean isGoldenRetriever();
}

现在,如果一个类实现了这个接口,它的样子会像这样:

public class SomeClass implements Dog
{
    public boolean Barks{
    // method definition here

    }

    public boolean isGoldenRetriever{
    // method definition here
    }
}

如果一个抽象类已经定义和声明了一些抽象函数,并且你想定义这些函数,或者说实现这些函数,那么你应该继承这个类,因为抽象类只能被继承。下面是一个例子:
public abstract class MyAbstractClass {

    public abstract void abstractMethod();
}

这里有一个MyAbstractClass的子类示例:

public class MySubClass extends MyAbstractClass {

    public void abstractMethod() {
        System.out.println("My method implementation");
    }
}

2
然而,接口是一个100%的抽象类,抽象类可以实现接口(100%的抽象类)而不需要实现它的方法。如果定义为“接口”,会有什么问题? 这只是一种惯例。Java语言的编写者决定"extends"是描述这种关系的最佳方式,所以我们都在使用它。 一般来说,即使接口是“100%的抽象类”,我们也不会这样考虑。我们通常将接口视为实现某些关键方法的承诺,而不是派生自类的类。因此,我们倾向于为接口和类使用不同的语言。 正如其他人所述,选择"extends"而不是"implements"是有好的原因的。

是的先生。这是一个惯例问题。许多人试图通过逻辑来证明Sun原始Java语言的限制,但这只是个人观点而已。如果编译器允许“implements”接口,我猜相同的人也会为其辩护。 :-) - Little Santi

0
接口类似于一个没有提供任何功能的抽象层。因此,它不是“实现”其他抽象层或接口,而是扩展它们。

-7

接口是包含不能创建任何对象的抽象方法的类。由于接口不能创建对象且它不是纯类,因此实现它没有意义。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接