子类的全部构造器,都会先调用父类的构造器,再执行自己
class F{
public F(){
System.out.println("===父类的无参数构造器===");
}
}
class Z extends F{
public Z(){
System.out.println("===子类的无参数构造器===");
}
}
public class Test {
public static void main(String[] args) {
//认识子类构造器特点
Z z = new Z();
}
}
执行结果:
说明在创建子类对象调用自己无参数构造器的时候,会先调用父类的无参数构造器然后再执行自己的。
如果是有参数构造器:
class F{
public F(){
System.out.println("===父类的无参数构造器===");
}
public F(String name){
System.out.println("父类 :"+name);
}
}
class Z extends F{
public Z(){
System.out.println("===子类的无参数构造器===");
}
public Z(String name){
System.out.println("子类 :"+name);
}
}
public class Test {
public static void main(String[] args) {
//认识子类构造器特点
Z z = new Z("闲聊");
}
}
执行结果:
子类的有参构造器会先调用父类的无参构造器。
原理:在每个子类构造器的第一行都会隐藏super();的代码,写不写都默认存在,这个就是用来调用父类无参构造器的。
如果把父类的无参构造器注释掉,会报错:
如果想让他们不报错,那么必须在子类构造器手写super()调用父类的有参构造器:
这样子类的全部构造器就不会报错了。