子类和父类构造函数执行的顺序有一定的规律,具体表现如下:
当创建一个子类对象时,先调用父类的构造函数,再调用子类的构造函数。这是因为子类继承了父类的属性和方法,需要先初始化父类的属性,子类才能使用父类的属性和方法。
如果父类有多个构造函数,子类必须调用其中一个的构造函数。一般情况下,子类调用父类的无参构造函数。如果父类没有无参构造函数,子类必须明确指定调用父类的哪个构造函数,并在子类的构造函数中使用 super 关键字调用。
如果父类和子类都有成员变量和构造函数,初始化的顺序是先初始化父类的成员变量和构造函数,再初始化子类的成员变量和构造函数。这是因为子类继承了父类的所有成员变量和构造函数,需要先初始化父类的属性和方法,子类才能使用父类的属性和方法,然后再初始化子类的属性和构造函数。
如果子类中使用了父类的成员变量或方法,必须在子类的构造函数中对它们进行初始化。子类构造函数中的 super()语句必须是第一条语句,因为只有在父类构造函数执行完毕后,子类才能访问父类的成员变量和方法。
如果子类中重写了父类的方法,当子类对象调用这个方法时,会执行子类中的方法,而不是父类中的方法。
总之,创建子类对象时,先初始化父类的成员变量和构造函数,再初始化子类的成员变量和构造函数,这样子类才能使用父类的属性和方法。