基本介绍
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