推荐的阅读顺序是:先看Test类,再根据提示看父类和子类
让我们通过代码来了解一下:
创建一个父类:
public class Father{
public Father(){
super();//默认调用Object构造方法(Object是所有类的父类)
System.out.println("父类构造方法");//写此行代码为了便于证实下面的第3点,Son类中的也是
}
public Father(String name){
System.out.println("Lucy");
}
}
创建一个子类:
public class Son extends Father{
public Son(){
super(); //最后将此处的super();改为this("");用来调用下面的有参构造方法
System.out.println("子类构造方法");
}
public Son(String name){
super(name); //此处调用Father类中的有参构造方法
}
}
创建一个Test类来调用父类子类中的构造方法 :
public class Test{
public static void main(String[] args) {
//1、一个类中如果没有定义构造方法,默认有一个无参构造方法,其结构如下:
/*
public 类名(){
super();//此行代码必须放在有效代码第一行,用来调用父类的无参构造方法
//请注意,该无参构造方法是默认的,即一个“类”中如果没有“有参构造方法”,则默认有一个“无参构造方法”,
//即使没有显现出来,也默认有
}
*/
//例如:请看Father类的2~5行和Son类的2~5行,即为默认的无参构造方法
//2、通过this([参数列表])调用本类中的构造方法,但必须放在有效代码的第一行,
// 所以一个构造方法已经调用了本类中的构造方法,就不能再直接调用父类中的构造方法
//3、如果子类构造方法没有调用本类中的构造方法,也没有指定调用父类中的哪个构造方法,
// 则默认调用父类中的无参构造方法
/*例如:在父类中创建一个有参构造方法,请看父类6~8行*/
//此时
new Son();//调用Son类中的“无参构造方法”
/*又因为Son类中的“无参构造方法”默认调用父类中的“无参构造方法”
(即使Son类中的无参构造方法中没有super();也默认有)
因此此处输出的结果就是:
父类构造方法
子类构造方法
*/
//4、如果父类没有无参构造方法(无论是显式的还是隐式的)则要求子类构造方法必须直接或间接
// 指定调用父类中的某个有参构造方法,且需放在有效代码第一行
//例如:请看Son类中的有参构造方法
//此时若:
new Son("");//调用Son类中的有参构造方法
//则输出的结果就是:
//Lucy
/*
假如把Son类中的无参构造方法里的“super()”改为“this("")”
则this("")调用的是本类(Son类)中的有参构造方法,
因此输出的结果就是:
Lucy
子类构造方法
*/
}
}