子类的全部构造器,都会先调用父类的构造器,再执行自己
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()调用父类的有参构造器:
这样子类的全部构造器就不会报错了。