【java基础】继承(extends)

基本介绍

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

猜你喜欢

转载自blog.csdn.net/m0_51545690/article/details/129218306