有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

abstract class A {
    abstract void method();
}

class B extends A {
    B() {
    }

    void method() {
    }
}

class C extends B {
    C() {
    }
}

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


共 (4) 个答案

  1. # 1 楼答案

    If a constructor body does not begin with an explicit constructor invocation and the constructor being declared is not part of the primordial class Object, then the constructor body implicitly begins with a superclass constructor invocation "super();", an invocation of the constructor of its direct superclass that takes no arguments.

    http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.8.7

  2. # 2 楼答案

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

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

    C(){
      super(); 
     }
    

    如果提供了默认构造函数,则会调用super()。 在您的例子中,C extends B所以B的构造函数被调用

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

  3. # 3 楼答案

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

  4. # 4 楼答案

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

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