子类继承父类后构造器的特点:
●子类中所有的构造器默认都会先访问父类中无参的构造器,再执行自己。
为什么?
●子类在初始化的时候,有可能会使用到父类中的数据,如果父类没有完成初始化,子类将无法使用父类的数据。
●子类初始化之前,一定要调用父类构造器先完成父类数据空间的初始化。
怎么调用父类构造器的?
●子类构造器的第一行语句默认都是:super(),不写也存在。
public class Test_02 {
public static void main(String[] args) {
new Dog2();
System.out.println("============================================");
new Dog2("大黄");
}
}
class Animal2 {
public Animal2() {
System.out.println("这是父类无参数构造器");
}
}
class Dog2 extends Animal2 {
public Dog2() {
System.out.println("这是子类无参数构造器");
}
public Dog2(String name) {
System.out.println(name + "这是子类有参数构造器");
}
}
运行结果:
这是父类无参数构造器
这是子类无参数构造器
============================================
这是父类无参数构造器
大黄这是子类有参数构造器
super调用父类有参数构造器的作用:
●初始化继承自父类的数据。
如果父类中没有无参数构造器,只有有参构造器,会出现什么现象呢?
●会报错。因为子类默认是调用父类无参构造器的。
如何解决?
●子类构造器中可以通过书写super(.….),手动调用父类的有参数构造器
this和super详情
this:代表本类对象的引用;
super:代表父类存储空间的标识。
![K}LBHB`@XUEUI8]QF3ANRC.png
this(..)和super(..)使用注意点:
●子类通过 this (..去调用本类的其他构造器,本类其他构造器会通过super去手动调用父类的构造器,最终还是会调用父类构造器的。
●注意: this(..) super(..)都只能放在构造器的第-行,所以二者不能共存在同一-个构造器中。
public class Student {
String name;
String school;
/**
* 如果学生不填写学校,默认这个对象是北京大学
* @param name
*/
public Student(String name) {
//借用本类兄弟构造器
this(name,"北京大学");
}
public Student(String name, String school) {
//super();必需先初始化父类,再初始化自己
this.name = name;
this.school = school;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSchool() {
return school;
}
public void setSchool(String school) {
this.school = school;
}
}
public class Test_02 {
public static void main(String[] args) {
//this(...)的作用:本类构造器中访问本类兄弟构造器
Student student1 = new Student("张三");
System.out.println(student1.getName());
System.out.println(student1.getSchool());
Student student2 = new Student("李四", "清华大学");
System.out.println(student2.getName());
System.out.println(student2.getSchool());
}
}
总结
1、super调用父类构造器的作用是什么?
通过调用父类有参数构造器来初始化继承自父类的数据