Discuss / Java / Java构造器 继承问题(子类是否必须实现父类的有参构造函数)

Java构造器 继承问题(子类是否必须实现父类的有参构造函数)

Topic source
为啥子类写了有参构造函数的public Salary(double income){
    this.income=income
}会报父类没有默认构造函数。但子类用public Salary(double income){
    super(income);}编译通过。

贴完整代码

public 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

Reply