Java子类构造函数调用顺序

在Java中,当一个类继承自另一个类时,子类的构造函数会先调用父类的构造函数,然后再执行自己的构造函数。这是由Java的继承机制决定的。本文将介绍Java子类构造函数调用顺序,以及相关的代码示例。

类图

classDiagram
  class Parent {
    - name: String
    + Parent(name: String)
  }
  
  class Child extends Parent {
    - age: int
    + Child(name: String, age: int)
  }
  
  Parent <|-- Child

上面的类图展示了一个父类Parent和子类Child之间的继承关系。Parent类有一个成员变量name,并且有一个带有参数的构造函数。Child类继承自Parent类,并新增了一个成员变量age,并且也有一个带有参数的构造函数。

代码示例

下面的代码示例展示了父类和子类的构造函数调用顺序:

public class Parent {
    private String name;

    public Parent(String name) {
        this.name = name;
        System.out.println("Parent constructor");
    }
}

public class Child extends Parent {
    private int age;

    public Child(String name, int age) {
        super(name);
        this.age = age;
        System.out.println("Child constructor");
    }
}

public class Main {
    public static void main(String[] args) {
        Child child = new Child("Alice", 10);
    }
}

运行上述代码,得到的输出结果是:

Parent constructor
Child constructor

代码中,Child类的构造函数调用了super(name),并传入了name参数。这里的super关键字表示调用父类的构造函数。在执行Child类的构造函数之前,会先调用父类Parent的构造函数。

构造函数调用顺序

在Java中,子类的构造函数调用父类的构造函数有几个特点:

  1. 子类的构造函数必须调用父类的构造函数,可以使用super关键字来实现。
  2. 如果子类的构造函数没有显式地调用父类的构造函数,编译器会自动插入一个默认的super()调用。
  3. 父类的构造函数在子类的构造函数之前被调用,这是因为子类继承了父类的属性和方法,需要先初始化父类的成员。
  4. 构造函数的调用顺序是从上到下,即从父类到子类。

总结

在Java中,子类的构造函数调用父类的构造函数的顺序是由上到下的,先调用父类的构造函数,然后再调用子类的构造函数。这是因为子类继承了父类的成员,需要先初始化父类的成员,然后再初始化子类的成员。

代码示例:

public class Parent {
    private String name;

    public Parent(String name) {
        this.name = name;
        System.out.println("Parent constructor");
    }
}

public class Child extends Parent {
    private int age;

    public Child(String name, int age) {
        super(name);
        this.age = age;
        System.out.println("Child constructor");
    }
}

public class Main {
    public static void main(String[] args) {
        Child child = new Child("Alice", 10);
    }
}

输出结果:

Parent constructor
Child constructor

以上是关于Java子类构造函数调用顺序的科普介绍,希望能帮助您更好地理解Java的继承机制。