Java中规定:在实例化子类对象时,必须先调用父类的构造方法,再调用子类的构造方法(先有父母再有孩子)。且必须在子类构造方法的第一行调用父类方法。
一般在子类中显式的调用父类构造方法,若没有显式调用的调用,则子类会默认调用父类的无参构造方法。(若父类没有无参构造方法,则会编译报错)
为什么要这样规定呢?
笔者认为:子类会从父类那里继承所有的成员变量与方法,若在每次继承父类时都在子类的构造方法中重新初始化继承的属性和行为,整个程序会变得冗长而复杂。
所以在继承父类后若要初始化继承来的属性,不如方便的调用父类的构造方法。(父类构造方法初始化一般使用this关键字来指示当前调用构造方法的对象),在子类中用super关键字调用父类的构造方法。
例子:
代码摘自廖雪峰Java学习教程:https://www.liaoxuefeng.com/wiki/1252599548343744/1260455778791232
public class Main {
public static void main(String[] args) {
// 给一个有普通收入、工资收入和享受国务院特殊津贴的小伙伴算税:
Income[] incomes = new Income[] {
new Income(3000),
new Salary(7500),
new StateCouncilSpecialAllowance(15000)
};
System.out.println(totalTax(incomes));
}
public static double totalTax(Income... incomes) {
double total = 0;
for (Income income: incomes) {
total = total + income.getTax();
}
return total;
}
}
class Income {
protected double income;
public Income(double income) {
this.income = income;
}
public double getTax() {
return income * 0.1; // 税率10%
}
}
class Salary extends Income {
public Salary(double income) {
super(income);
}
@Override
public double getTax() {
if (income <= 5000) {
return 0;
}
return (income - 5000) * 0.2;
}
}
class StateCouncilSpecialAllowance extends Income {
public StateCouncilSpecialAllowance(double income) {
super(income);
}
@Override
public double getTax() {
return 0;
}
}
此例子中,每个子类的构造方法都直接调用父类的构造方法来初始化对应的收入值,父类构造方法中使用this关键字以便子类实例化对象调用初始化自身属性!
个人粗浅理解,如有谬误,欢迎指正。