子父类中构造方法的调用
在创建子类对象时,父类的构造方法会先执行,因为子类中所有构造方法的第一行有默认的隐式 super()
;
语句
格式
调用本类中的构造方法
- this(实参列表);
调用父类中的空参数构造方法
- super();
调用父类中的有参数构造方法
- super(实参列表);
为什么子类对象创建都要访问父类中的构造方法?
因为子类继承了父类除构造方法外所以有的内容,所以创建子类对象时,必须要先调用父类的构造方法,看是如何对其内容进行初始化的
例如
class FuA{
FuA(){
System.out.println("FuA");
}
}
class ZiA extends FuA{
ZiA(){
//super();调用父类无参构造方法
System.out.println("ZiA");
}
}
public class Test{
public Test() {
System.out.println("zi");
}
public static void main(String[] args) {
ZiA ziA = new ZiA();
}
}
//运行结果:
//FuA
//ZiA
通过代码我们可以发现虽然子类的构造方法中并没有使用 super() 来调用父类的无参构造方法,但是却调用了父类的无参构造方法,这说明子类的构造方法中有一句 super();
子类会继承父类中的内容,所以子类在初始化时,必须先到父类中去执行父类的初始化动作。这样,才可以使用父类中的内容。当父类中没有空参数构造方法时,子类的构造方法必须有显示的super语句,指定要访问的是父类有参数构造方法。
创建子类对象的时候必须调用父类的构造方法
- 子类默认会调用父类的无参构造, 但如果父类没有无参构造,子类的构造方法继续调用父类的无参构造就会报错
- 因此子类构造方法的第一行需要调用父类的构造方法,既可以调用父类的无参构造,也可以调用父类的有参构造,这样语法上就不会报错
构造方法的第一行,写 this() 还是 super()
- this() 是调用本类的构造方法,super() 是调用父类的构造方法,且两条语句不能同时存在
- 子类不存在构造方法的互相调用
小结:
- 无论如何,子类的所有构造方法,直接或间接必须调用到父类构造方法;
- 子类的构造方法什么都不写,默认的构造方法第一行 super();
创建子类对象过程的细节
- 如果子类的构造方法第一行写了
this
调用了本类其他构造方法,那么 super 调用父类的语句还有吗?
这时是没有的,因为 this() 或者 super(),只能放在构造方法的第一行,因为初始化动作要先执行
子类构造方法中调用其他的构造方法
格式:this(参数列表);
class FuA{
FuA(){
System.out.println("FuA");
}
void method(){
System.out.println("FuA method");
}
}
class ZiA extends FuA{
ZiA(){
super();
//this(10); 这里会报错 this()必须放在第一行
}
ZiA(int a){
System.out.println("ZiA");
}
void sleep() {
System.out.println("ZiA sleep");
}
}
2.父类的构造方法中是否有隐式的 super 呢?
答案是肯定的,只要是构造方法默认第一行都是super();
3.父类的父类是谁呢?super 调用的到底是谁的构造方法呢?
在Java中,Object是所有类的父类,祖先类
注意:
1.类中的构造方法第一行都有隐式的 super() 语句,访问父类中无参的构造方法。所以父类的构造方法既可以给自己的对象初始化,也可以对自己的子类对象初始化
2.如果默认的隐式 super() 语句在父类中没有对应的构造方法,那么必须在构造方法中通过 this 或者 super 的形式明确要调用的构造方法。