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


104

我的意思是:

interface B {...}

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

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

我用谷歌搜索,发现了这个

implements表示定义接口方法的实现。但是接口没有实现,因此是不可能的。

但是,interface是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

Answers:


110

implements表示实现,当interface旨在声明仅提供interface不提供实现时。

100%abstract class在功能上等效于,interface但是如果您愿意的话,它也可以实现(在这种情况下,它不会保持100%abstract),因此从JVM的角度来看,它们是不同的。

同样,100%抽象类中的成员变量可以具有任何访问限定符,在接口中它们是隐式的public static final


8
从Java 8开始,接口可以具有默认方法,在这方面,它们与抽象类非常相似。
forresthopkinsa

4
谢谢你的最后一句话!
张涛

24

implements意味着将定义abstract方法的行为(显然是抽象类除外),而您定义实现。

extends 表示行为是继承的。

使用接口可以说一个接口应该具有与另一个接口相同的行为,甚至没有实际的实现。这就是为什么将一个接口与extends另一个接口而不是实现它更有意义。


附带说明一下,请记住,即使一个abstract类可以定义abstract方法(接口做的合理方式),它仍然是一个,仍然必须继承(扩展)而不实现。


4

从概念上讲,有两个“域”类和接口。在这些域中,您总是在扩展,只有一个类实现了接口,这是一种“跨越边界”的接口。因此,基本上,接口的“扩展”反映了类的行为。至少我认为这是背后的逻辑。似乎并非所有人都同意这种逻辑(我发现自己有点作弊),实际上,完全没有技术上的理由拥有两个不同的关键字。


如果“ Y扩展X”且未密封,则可能会有另一种类型“ Z”扩展“ Y”。无论X是接口还是类,都是如此。但是,如果“ W实现X”,则不可能有“ V实现W”。“扩展”可以“链接”和“实现”这一事实似乎不能成为拥有不同关键字的充分理由。
2013年

2

但是,接口是100%抽象类,抽象类可以实现接口(100%抽象类)而无需实现其方法。将其定义为“接口”时会出现什么问题?

这仅仅是一个惯例问题。Java语言的作者认为“扩展”是描述这种关系的最佳方法,因此这就是我们所有人所使用的。

通常,即使接口是“ 100%抽象类”,我们也不会这样考虑。我们通常将接口视为实现某些关键方法的承诺,而不是从其派生的类。因此,我们倾向于对接口和类使用不同的语言。

正如其他人指出的那样,有充分的理由选择“扩展”而不是“实现”。


是的先生。这是惯例问题。当只是个人观点时,许多人试图从逻辑上证明Sun最初的Java语言约束。如果编译器添加了“实现”接口,我想同样的人也会对此加以辩解。:-)
Little Santi

1

希望这对您在大学期间从oops(核心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");
    }
}

0

接口就像一个不提供任何功能的抽象。因此,它不是“实现”,而是扩展了其他抽象或接口。


-6

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.