当我们在Java中实现许多接口时,我们真正继承了什么?

时间:2014-06-25 09:25:33

标签: java inheritance

据说Java可以通过实现多个接口来实现多重继承。根据有关继承的Java文档here

  

子类从其超类继承所有成员(字段,方法和嵌套类)。继承的想法很简单但很强大:当你想创建一个新类并且已经有一个包含你想要的代码的类时,你可以从现有的类派生你的新类。在这样做时,您可以重用现有类的字段和方法,而无需自己编写(和调试!)它们。

和关于接口here,它说接口没有实现方法。它们只包含方法声明。另外,据我所知,接口也不包含嵌套类。还有一点,并非所有接口都有常量字段,很多时候接口(我用于工作)只包含方法声明。

在这种情况下,如果我们必须自己定义所有方法,我们真正从它们那里继承了什么?我非常了解接口的其他用途。但是我没有得到与继承有什么关系。

2 个答案:

答案 0 :(得分:3)

接口提供契约,这意味着当类实现接口时,根据定义它提供了一组方法。如何实现这些是由实现接口的类。

考虑:

public interface IPrint
{
     public void print(String str);
}

public interface IClean
{
    public void clean();
} 

public class CanonPrint implements IPrint, IClean   //Prints to a physical canon printer
{
    public void print(String str)
    {
         //Send data to canon printer
    }

    public void clean()  
    {
        //Clean printer buffer, etc
    } 
}

public class Console implements IPrint, IClean   //Prints to a console
{
    public void print(String str)
    {
         //Send data to console
    }

    public void clean()  
    {
        //Clean console buffer, etc
    } 
}

上面的例子,你知道CanonPrintConsolePrint类可以自己打印和清理,他们有逻辑去做,事实上他们实现了IPrintIClean接口可以保证它。没有任何东西是继承的,没有扩展功能,只保证一组功能。委托逻辑等。

答案 1 :(得分:3)

  

在这种情况下,如果我们必须自己定义所有方法,我们真正从它们那里继承了什么?

在经典Java(7及更早版本)中,实现一个接口可以:

  • 与抽象的“is-a”关系,
  • 必须实现的一组方法签名(以满足“is-a”关系),
  • 隐含的“合同”,说明方法应该做什么。

在Java 8中,您还继承了接口中声明的default方法。

一个类implements接口并不固有任何状态声明,或者可以访问状态声明的方法,就像extend类一样。但另一方面,一个类可以implement多个接口......你无法使用extend

简而言之,implements允许您执行使用extends反之亦然无法执行的操作。