Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当我们在Java中实现许多接口时,我们真正继承了什么?_Java_Inheritance - Fatal编程技术网

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

当我们在Java中实现许多接口时,我们真正继承了什么?,java,inheritance,Java,Inheritance,据说Java有一个替代方案,可以通过实现多个接口来实现多重继承。根据Java文档中关于继承的内容,我们发现: 子类从其超类继承所有成员(字段、方法和嵌套类)。继承的思想很简单,但功能强大:当您想要创建一个新类,并且已经有一个类包含您想要的一些代码时,您可以从现有类派生新类。通过这样做,您可以重用现有类的字段和方法,而无需自己编写(和调试!) 关于接口,它说接口没有实现方法。它们只包含方法声明。而且,据我所知,接口也不包含嵌套类。还有一点,并不是所有的接口都有常量字段,很多时候接口(我在工作中使用

据说Java有一个替代方案,可以通过实现多个接口来实现多重继承。根据Java文档中关于继承的内容,我们发现:

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

关于接口,它说接口没有实现方法。它们只包含方法声明。而且,据我所知,接口也不包含嵌套类。还有一点,并不是所有的接口都有常量字段,很多时候接口(我在工作中使用的)只包含方法声明


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

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

考虑:

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
    } 
}
在上面的示例中,您知道
CanonPrint
ConsolePrint
类可以自己打印和清理,它们有这样做的逻辑,它们实现
IPrint
IClean
接口的事实保证了这一点。没有任何东西是继承的,没有任何功能被扩展,只有一组功能。逻辑等是委托的

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

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

  • 与抽象的“是-是”关系
  • 必须实现的一组方法签名(以满足“is-a”关系),以及
  • 一个隐含的“契约”,说明这些方法应该做什么
在Java8中,您还继承接口中声明的
default
方法

的确,
实现的类
接口并不固有任何状态声明,也不存在可以访问状态声明的方法,如果它扩展了一个类的话。但另一方面,一个类可以实现多个接口。。。这是用
extend
无法做到的


简而言之,
implements
允许您做
extends
无法做的事情,反之亦然。

我想补充一点,因为Java8可以在接口中实现方法。是的。我完全同意。但是,我们从他们那里继承了什么?因为继承,我们可以直接调用实现的超类的公共和受保护方法。@NullPointer继承告诉我们类是什么。接口告诉类可以存储什么。例如,ArrayList是一种抽象列表,但声明它可以被克隆和序列化。Ok。因此,这只是两个类包含的一组公共特性。这种相似性被表示为继承,不是吗?现在我明白了。谢谢Stephen C。接口可以包含嵌套类。