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

在java中实例化子类时,会自动调用父类构造函数

在java中实例化子类时,会自动调用父类构造函数,java,Java,当我在main中实例化类C时,它会自动调用B父类的构造函数。这是正常的还是我做错了什么?没有什么错,有对超级构造函数的隐式调用 您还没有为C类编写任何构造函数,所以默认构造函数将由编译器提供,编译器将提供 abstract class A { abstract void method(); } class B extends A { B() { } void method() { } } class C extends B { C() {

当我在main中实例化类C时,它会自动调用B父类的构造函数。这是正常的还是我做错了什么?

没有什么错,有对超级构造函数的隐式调用

您还没有为C类编写任何构造函数,所以默认构造函数将由编译器提供,编译器将提供

abstract class A {
    abstract void method();
}

class B extends A {
    B() {
    }

    void method() {
    }
}

class C extends B {
    C() {
    }
}
如果提供了默认构造函数,则会调用super。 在您的例子中,C扩展了B,因此调用了B的构造函数


如果您不使用任何其他类创建一个类,那么默认情况下它也会扩展对象类。因此将调用对象类构造函数

java中每个构造函数的第一行调用超级构造函数,这就是java的工作方式。 你应该读一读

如果构造函数主体不是以显式构造函数开头 调用和声明的构造函数不是 原始类对象,则构造函数体隐式开始 使用超类构造函数调用super;,援引 不带参数的直接超类的构造函数


当您实例化一个C时,会有C、B、a和Object的构造函数调用。C必须能够表现为任何直接或间接超类,并且具有所有超类的字段。类X构造函数的任务是使被初始化的对象能够作为X类构造函数工作


如果没有声明的构造函数,编译器将创建一个无参数构造函数,因此每个类都至少有一个构造函数。如果不是对象构造函数的构造函数没有以this或super构造函数调用开头,编译器将其视为以super;,对立即超类的无参数构造函数的调用

只有在不调用重载的情况下,才可以调用此函数。+1用于解释构造函数链接。@PaulBellora这是构造函数重载。链接发生在继承树上,要么是Prasad解释过的隐式链接,要么是使用super显式链接,super也可能重载。
C(){
  super(); 
 }