在Java中,构造函数常常用于初始化操作,将一些初始化操作放入构造函数中,是大家一种常用的方法。 那么在Java的继承中,构造函数又是怎么一会事呢,在这里总结一下:

一、理论分析

(1) 一个类(如:ClassA),如果没有声明任何构造函数,那么系统会自动生成一个无参构造函数,此时使用ClassA myClass = new ClassA(),不会报错。但是,如果显式声明了一个有参构造函数,却没有声明一个无参构造函数的话,系统不会自动生成 一个无参构造函数,此时,再使用ClassA myClass = new ClassA()就会报错。如果要消除报错,则必须使用有参构造函数, 或者添加一个无参构造函数。所以,一个类的构造函数,一般只有三种状况:无参 或者 无参 + 有参 或者 有参

(2) 在继承关系中,子类的所有构造函数(包括无参构造函数(默认构造函数),有参构造函数等),如果不显式声明调用哪种 super,那么都会默认调用super(),即都会默认调用父类的无参构造函数(默认构造函数)。而,如果父类此时没有无参构造 函数存在的话,就会报错。为了修改报错,只能显式调用父类显式声明的构造函数之一或者在父类中增加无参构造函数。

(3) 在继承关系中,当使用new一个类时,程序的执行顺序为:首先执行父类的构造函数方法,再执行自身的构造函数方法, 这个执行顺序不可更改,否则报错或不能运行。 (4) 在深度继承关系中,即当存在C继承B,B继承A,或者更多层继承时,首先执行最上层的构造函数,再依次顺着继承链传递下去, 一直到创建对象的那个类。例如:我们声明C对象时,调用的是C的构造函数c,构造函数c调用的是父类B的构造函数b,构造函数b调用 的是父类A中的构造函数a,那么执行结果就是:a => b => c 。

二、实践操作

为了验证理论,我们进行了操作实践,下面提供实践代码,亲自实践之后,才会深刻懂得继承中,构造函数的关系。 代码说明:继承关系为ClassC继承ClassB,ClassB继承ClassA。Test为执行测试类。

  1. public class ClassA {
  2. public ClassA() {
  3. System.out.println("父类的无参构造函数。");
  4. }
  5. public ClassA(String string){
  6. System.out.println("父类的有参构造函数");
  7. }
  8. }
  1. public class ClassB extends ClassA {
  2. public ClassB(){
  3. super(null);
  4. System.out.println("子类的无参构造函数");
  5. }
  6. public ClassB(String str){
  7. System.out.println("子类的有参构造函数");
  8. }
  9. }

参考文档: https://blog.csdn.net/qiumengchen12/article/details/44829907