【java基础】继承(extends)

生活中,最使人疲惫的往往不是道路的遥远,而是心中的郁闷;最使人痛苦的往往不是生活的不幸,而是希望的破灭;最使人颓废的往往不是前途的坎坷,而是自信的丧失;最使人绝望的往往不是挫折的打击,而是心灵的死亡。所以我们要有自己的梦想,让梦想的星光指引着我们走出落漠,走出惆怅,带着我们走进自己的理想。

导读:本篇文章讲解 【java基础】继承(extends),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

基本介绍

java的继承简单一点说就是一个类对另一个类的扩展,是is-a的关系。利用Employee(员工类)和Manager(经理类)来举例,Manager继承了Employee,也就是对Employee的扩展,Manager是一个特殊的Employee,但是Employee却不是Manager。他们直接就存在is-a的关系。
继承的关键字是extends

public class Employee {

}
public class Manager extends Employee{

}

对于Employee类,我们一般称为超类,父类或者基类。
对于Manager类,我们一般称为子类,派生类或者孩子类
通过继承,子类会拥有父类的除私有外的所有字段,方法,构造器。

快速使用

定义

我们定义一个员工类(Employee),该类具有名称和薪水字段

public class Employee {
    private String name;
    private double salary;

    public Employee(String name, double salary) {
        this.name = name;
        this.salary = salary;
    }

    public Employee() {
    }

    public double getSalary() {
        return salary;
    }
}

我们定义一个经理类(Manager)继承员工类(Employee),该类除了有基本工资之外还有奖金,所以再定义一个奖金字段

public class Manager extends Employee {
    private double bonus;
    
    public void setBonus(double bonus) {
        this.bonus = bonus;
    }
}

覆盖方法

我们可以发现在父类中有一个getSalary方法,这个方法会返回薪水

    public double getSalary() {
        return salary;
    }

对于Employee来说是正确的,但是Manager的薪水构成确实基本构造工资+奖金,如果使用Manager调用这个方法就不正确了,所以我们得要重写该方法,在Manager中添加如下内容

    @Override
    public double getSalary() {
        return super.getSalary() + bonus;
    }

上面代码中的@Override是一个注解,用于检查是否成功覆盖,可以不写(建议写)。super关键字就是代表父类,super.getSalary()就是调用父类的getSalary方法。我们在子类里面重写了父类的getSalary方法,让其返回基本薪水和工资。
写完以后,如果我们使用Manager调用getSalary调用就是返回基本工资+薪水的值
我们在子类中可以增加字段,增加方法,覆盖方法,但是不能够删除任何字段和方法!!!

子类构造器

我们在上面更改了子类的getSalary方法,看起来貌似已经正确了。事实上,还有一个问题,我们无法在Manager中指定name和salary,因为这2个字段在父类中是私有的,也没有提供对应的set方法,只有一个构造器用来初始化name和salary。
有人可能会想,既然父类已经有构造器了,直接使用不就行了吗?例如下面代码

Manager ttpfx = new Manager("ttpfx",12000);

但是这样写编译器会报告一个错误,因为Manager类并没有提供一个关于name和salary的构造器。
我们需要在Manager中进行添加。

    public Manager(String name, double salary) {
        super.name = name;
        super.salary = salary;
    }

大家觉得上面的代码正确吗?当然是错误的,因为name和salary都是私有字段,所以我们只能使用父类的构造器来进行初始化

     public Manager(String name, double salary) {
        super(name,salary);
    }

super和this其实很相似,只不过一个代表父类,一个代表当前类。this和super调用构造器时都只能作为第一条语句,并且调用构造器只能在构造器里面使用

对于构造器,还有一些说明如下
如果子类构造器没有显示的调用父类的构造器,那么默认就会调用父类的无参构造器,如果父类没有无参构造器就会报错

使用

现在,我们就已经可以使用了

    public static void main(String[] args) {
        Employee tom = new Employee("tom", 10000);
        Manager ttpfx = new Manager("ttpfx", 12000);
        ttpfx.setBonus(50000);
        System.out.println(tom.getSalary());
        System.out.println(ttpfx.getSalary());
    }

输出如下

10000.0
62000.0

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/140204.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!