说来惭愧,很久以前就总结过,但是当时不知道咋写博客,就没有在这里记录。然后,我以前总结的东西也不知道哪里去了,有点尴尬哈!
总之先进入正题:
//父类
class Person {
public String name;
public int age;
//父类无参构造函数
Person() {
//其实父类无参构造函数里也隐式调用了super();只不过调用的是父类Object里的无参构造函数
System.out.println("父类无参数构造函数---------person");
}
//父类有参构造函数
Person(String name) {
this.name = name;
System.out.println("父类有参数构造函数 ---------person :" + name);
}
}
//子类
class Student extends Person {
//子类无参构造函数
Student() {
//系统会在第一行隐式调用super(); 故super();可写可不写
System.out.println("子类无参数构造函数---------student");
}
//子类有参构造函数
Student(String name) {
//必须手动调用super(name);
super(name);
System.out.println("子类有参数构造函数---------student :" + name);
}
}
//一个java文件中只能存在一个public权限的类,且该类的类名必须和java文件名一致
public class Test {
public static void main(String[] args) {
Student s = new Student();
Student s1 = new Student("zhangsan");
}
}
运行结果
如果我们把子类有参构造函数里的super(name);
注释掉:
再来看看运行结果:
有没有发现两次的运行结果不一样呢?
如果继续在子类有参构造函数中加入this();
如图
一起看看运行结果:
有没有发现运行结果又不一样了呢?
好,我们再再上面的基础上修改子类无参构造函数
咱再来看看运行结果:
哈哈,好像有不一样了呢!
总结:
对于子类构造函数,如果没有手动super调用父类构造函数时,系统会默认在子类构造函数里优先调用父类无参的构造函数,然后再执行子类构造函数里的代码;如果手动super调用父类构造函数了,则不再调用系统默认的无参父类构造函数。
this();
在这里,其实就是调用子类无参构造函数。如果在子类有参的构造函数中,你不想手动写super();,你也 可以通过写this();
调用子类无参构造函数,然后子类无参构造函数又自动调用父类无参构造函数(不管是手动写的super(),还是系统调用的父类无参构造函数)
对于子类有参的构造函数,你想给成员变量赋值的话,就必须手动写super(name);