在学习继承时,构造方法的访问规则很多同学还不是很清楚,这里带着大家来理一理思路,对学习的知识进行梳理与巩固。
继承关系中,父子类构造方法的访问特点:
1.子类构造方法当中有一个默认的"super()"调用,所以一定是先调用的父类构造,后执行的子类构造
//父类代码
public class Fu {
int a;
int b;
public Fu(){
System.out.println("父类构造方法!");
}
}
=================================================
//子类代码
public class Zi extends Fu {
public Zi(){
System.out.println("子类构造方法!");
}
}
==================================================
//测试类
public class Demo01Constructor {
public static void main(String[] args) {
Zi zi = new Zi();
}
}
运行结果如下:
由此可见,当使用无参构造创建子类对象时,会默认优先调用父类的无参构造。
2.子类构造可以通过super关键字来调用父类重载构造。
//父类代码
public class Fu {
int a;
int b;
public Fu(){
System.out.println("父类构造方法!");
}
public Fu(int i) {
System.out.println("父类重载的构造");
}
}
=================================================
//子类代码
public class Zi extends Fu {
public Zi(){
super(1);
System.out.println("子类构造方法!");
}
}
==================================================
//测试类
public class Demo01Constructor {
public static void main(String[] args) {
Zi zi = new Zi();
}
}
运行结果如下:
3.super的父类构造调用,必须是子类构造方法的第一个语句,不能一个子类构造调用多次super构造
如上图,多次调用父类的构造方法会报错。
子类中this的使用:
在子类中,我们也可以在子类的无参构造中调用子类的有参构造,这时我们可以使用this();来调用本类中其他的方法。
//父类代码
public class Fu {
int a;
int b;
public Fu(){
System.out.println("父类构造方法!");
}
}
=================================================
//子类代码
public class Zi extends Fu {
public Zi(){
this(1);
System.out.println("子类构造方法!");
}
public Zi(int a) {
System.out.println("子类的有参构造");
}
}
==================================================
//测试类
public class Demo01Constructor {
public static void main(String[] args) {
Zi zi = new Zi();
}
}
运行结果如下:
由此可见我们在子类的构造方法中,既可以访问父类的构造方法,也可以访问子类的构造方法,BUT>>>
super();必须写在构造方法的第一行;
this也必须写在构造方法的第一行,
当我们把this()放在第一行时,super()就会报错,
而当我们把super()放在第一行的时,this()就会报错
所以这两个不可以同时出现,只能写一个,不然代码就会报格式错误!!!
总结:
子类必须调用父类构造方法,不写则赠送super();
写了则用写的指定的super调用;
super只能有一个,还必须是第一个;
this也只能是第一个,所以super()和this()不可以同时出现