子类构造器的特点:
- 子类的全部构造器,都会先调用父类构造器(默认调用无参构造器,父类无无参构造器时,须在子类手写super(参数列表),调用父类的有参构造器),再执行自己的构造器
- 示例代码:
package com.zzfeng.d14_extends_constructor;
class F {
public F() {
System.out.println("父类无参构造器");
}
}
class Z extends F {
public Z() {
System.out.println("子类Z,无参构造器");
}
public Z(String name) {
System.out.println("子类Z,有参构造器");
}
}
public class Test {
public static void main(String[] args) {
Z z = new Z();
Z z1 = new Z("名字");
}
}
子类构造器是如何实现调用父类构造器的:
- 默认情况下,子类全部构造器的第一行代码都是super()(写不写都有),他会调用父类的无参构造器
- 如果父类没有参数构造器,则我们必须在子类构造器的第一行手写super(…),指定调用父类的有参构造器
子类构造器调用父类构造器的常见应用场景
package com.zzfeng.d14_extends_constructor;
public class Test2 {
Teacher t = new Teacher("zzfeng", 18, "movie");
}
class Teacher extends People {
private String skill;
public Teacher(String name, int age, String skill) {
super(name, age);
this.skill = skill;
}
public String getSkill() {
return skill;
}
public void setSkill(String skill) {
this.skill = skill;
}
}
class People {
private String name;
private int age;
public People() {
}
public People(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
- 对象由子类父类多个设计图设计,要调用子类父类的构造器才能完成初始化
- 子类构造器可以通过调用父类构造器,把对象中包含父类这部分的数据先初始化赋值,再回来把对象里包含子类的这部分的数据也进行初始化赋值
this(…)调用兄弟构造器
- 任意类的构造器中,是可以通过this(…)去调用该类的其他构造器的
- 示例代码:
package com.zzfeng.d14_extends_constructor;
public class Test3 {
public static void main(String[] args) {
Student s = new Student("joker", 18, "家里的");
Student s1 = new Student("joker", 18);
System.out.println(s1.getName());
System.out.println(s1.getAge());
System.out.println(s1.getSchoolName());
}
}
class Student {
private String name;
private int age;
private String schoolName;
public Student() {
}
public Student(String name, int age) {
this(name, age, "电子厂");
}
public Student(String name, int age, String schoolName) {
this.name = name;
this.age = age;
this.schoolName = schoolName;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSchoolName() {
return schoolName;
}
public void setSchoolName(String schoolName) {
this.schoolName = schoolName;
}
}
this(…)和super(…)使用时的注意事项:
- this(…)和super(…)都只能放在构造器的第一行,因此,有了 this(…)就不能写super(…)了,反之亦然
super(…)调用父类有参数构造器的常见应用场景是什么?
this(…)的作用是什么?