Java子类的构造方法为什么要先调用父类的构造方法

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关键字以便子类实例化对象调用初始化自身属性!
个人粗浅理解,如有谬误,欢迎指正。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值