先写一个Father类作为父类,再写一个Son01类作为其的子类,最后写一个测试类Test类。
一、默认构造器为无参
第一种情况,我们把默认的无参构造器重新编写一下,使其被调用的时候能被我们所观察,事实上在子类中Son01的构造器里面有一个super();这个方法只是被隐藏了,直接上代码。
public class Father {
private String name;
private int age;
public Father(){
System.out.println("Father的无参构造被调用");
}
public Father(String name, int age) {
this.name = name;
this.age = age;
System.out.println("Father的有参构造被调用");
}
}
public class Son01 extends Father{
public Son01() {
//super();这个方法被隐藏了
System.out.println("构造器Son01被调用");
}
}
public class Test {
public static void main(String[] args) {
Son01 son01 = new Son01();
}
}
运行结果如下
Father的无参构造被调用
构造器Son01被调用
二、默认构造器被有参构造覆盖
第二种,我们直接删除开始写的无参构造器,但是这个时候我们的子类Son01会报错,报错的原因是找不到默认的无参构造器,这时我们需要给他一个super("jack" ,18);这时他就会得到我们重写的有参构造器。直接上代码。
public class Father {
private String name;
private int age;
// 这里把默认的无参构造去掉
// public Father(){
// System.out.println("Father的无参构造被调用");
// }
public Father(String name, int age) {
this.name = name;
this.age = age;
System.out.println("Father的有参构造被调用");
}
}
public class Son01 extends Father{
public Son01() {
super("jack",18);//这里不添加这个就会报错
System.out.println("构造器Son01被调用");
}
}
public class Test {
public static void main(String[] args) {
Son01 son01 = new Son01();
}
}
运行结果如下
Father的有参构造被调用
构造器Son01被调用
总结
1,子类必须调用父类的构造器,完成父类的初始化。
2,当创建子类对象时,不管使用子类的哪一个构造器,默认情况下总会去调用父类的无参构造器,如果父类没有提供无参构造器,则必须在子类的构造器中用super去指定使用父类的哪一个构造器完成对父类的初始化,否者编译不会通过。