Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.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_Multiple Inheritance - Fatal编程技术网

Java 在没有构造函数的接口中如何支持多重继承?

Java 在没有构造函数的接口中如何支持多重继承?,java,inheritance,multiple-inheritance,Java,Inheritance,Multiple Inheritance,如果没有构造函数链接,就不可能发生继承,那么继承如何在接口中发生以及多重继承是可能的?类和接口之间没有继承,只有实现关系。由于实现多个接口的类实际上没有继承它们的任何内容,所以我看不出有任何问题。实现者类不必调用构造函数,因为接口只是一种契约:实现者类必须提供接口方法。您从一个错误的前提开始: 如果没有构造函数链接,就不可能继承 继承不需要构造函数链接 接口没有每实例状态,也没有构造函数(它们没有每实例状态这一事实对于它们没有构造函数是至关重要的)。然而,它们可以包括 抽象方法(例如,没有实现

如果没有构造函数链接,就不可能发生继承,那么继承如何在接口中发生以及多重继承是可能的?

类和接口之间没有继承,只有实现关系。由于实现多个接口的类实际上没有继承它们的任何内容,所以我看不出有任何问题。实现者类不必调用构造函数,因为接口只是一种契约:实现者类必须提供接口方法。

您从一个错误的前提开始:

如果没有构造函数链接,就不可能继承

继承不需要构造函数链接

接口没有每实例状态,也没有构造函数(它们没有每实例状态这一事实对于它们没有构造函数是至关重要的)。然而,它们可以包括

  • 抽象方法(例如,没有实现),类继承并必须实现这些方法,或者,如果是抽象类,则声明
    abstract

  • default
    方法,其实现由实现类继承,除非该类定义自己的实现

对于默认方法,假设您有:

interface TheInterface {
    default void answer() {
        System.out.println("42");
    }
}
class TheClass implements TheInterface {
}
TheClass c = new TheClass();
c.answer(); // Outputs "42"
那么你有:

interface TheInterface {
    default void answer() {
        System.out.println("42");
    }
}
class TheClass implements TheInterface {
}
TheClass c = new TheClass();
c.answer(); // Outputs "42"
继承自
接口
,从类型角度(类的实例是一个“
接口
)和实现角度(类继承自
接口
应答
的实现)。但是没有构造函数链接,因为接口没有构造函数,因为它们没有每个实例的状态


您可能会认为有一个无参数构造函数可以调用类,但我们可以从字节码中看到,类的构造函数链接到对象,而不是接口:

javap-c类

class TheClass implements TheInterface { TheClass(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object."":()V 4: return } 类该类实现接口{ 类(); 代码: 0:aload_0 1:invokespecial#1//方法java/lang/Object。“:()V 4:返回 }
类现在可以从接口继承东西,特别是默认方法。类从它们继承的接口继承除静态方法之外的所有东西,并且总是继承。因此,这个答案显然是错误的。来自JLS:“类C从其直接超类和直接超接口继承所有
抽象
和默认(§9.4)方法
m
,对于这些方法,以下所有内容都是正确的:…”(强调原始)类也从其超接口继承抽象方法。@LewBloch:你是什么意思,签名?我谈到了“…从类型的角度来看。”显然不是实现,因为根据定义,没有实现。当然,我可以澄清这一点。我只是简单地指出,JLS明确表示类从它们的超级接口继承抽象和默认方法。我的意思正是JLS的意思。