Java构造器 继承问题(子类是否必须实现父类的有参构造函数)
Topic sourcepublic class DuotaiYingyong {
public static void main(String[] args) {
Income[] incomes = new Income[]{
new Income(3000), new Salary(7500), new Zhengfu(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; }
}
class Salary extends Income {
public Salary(double income) {
this.income = income; }
@Override public double getTax() {
if (income <= 5000) {
return 0; }
return (income - 5000) * 0.2; }
}
class Zhengfu extends Income {
public Zhengfu(double income) {
this.income = income; }
@Override public double getTax() {
return 0; }
}
上面的代码,Income的子类构造方法会报错,提示没有默认构造函数,编译报错Error:(29, 38) java: 无法将类 Income中的构造器 Income应用到给定类型;
需要: double
找到: 没有参数
原因: 实际参数列表和形式参数列表长度不同。
但在父类Income中添加一个无参构造函数public Income(){}就能正常编译
定义类时没有显式定义构造函数时,编译器会自动增加一个默认的无参数空构造函数。
子类构造函数必须调用父类构造函数,不显式声明super调用,会默认调用这个无参构造函数。
这些都是编译器自动完成的。
你给Income类定义了一个public Income(double)的构造函数,编译器就不会添加默认无参构造函数,子类构造函数就必须显式去super调用父类的某个具体构造函数,或者给父类补上无参构造函数让默认调用可以正常通过编译。
上例中,你把
public Salary(double income){
this.income = income;
}
改成
public Salary(double income){
super(income);
}
Income类不加无参构造函数也能通过编译了。
- 1
麻辣小龙侠201709