- 现假设有一个Employee(雇员类)和Manager(经理类),其中Employee中有一个薪资getSalary()方法及加薪raiseSalary()方法,Manager有一个奖金setBonus ()方法.
- Manager继承Employee
Manager类中的getSalary()方法应该返回薪资和奖金的总和.所以需要在Manager中提供一个新的方法来覆盖超类Employee中的方法
public class Manager extends Employee{
.
.
public double getSalary() {
.
.
}
}
- 具体该如何实现???
- 看起来感觉很简单,只要返回salary和 bonus 的总和就可以
public double getSalary() {
return salary + bonus; //报错
}
- 因为Manager 类的 getSalary 方法不能直接访问超类的私有域
- 如果Manager类的方法一定要访问私有域,就必须借助于共有的接口
2.将对salary域的访问替换成调用 getSalary 方法
public double getSalary() {
double baseSalary = getSalary(); //报错
return baseSalary +bonus;
}
- 这样仍然无法运行,因为Manager 类也有一个 getSalary 方法(就是正在实现的方法),所以这条语句将会导致无限次调用自己,直到程序崩溃
- 在这里,我们需要希望调用超类 Employee 中的方法,而不是当前类的方法.
- 因此需要 super 关键字
- 正确的调用超类中的getSalary()
public double getSalary() {
double baseSalary = super.getSalary(); //报错
return baseSalary +bonus;
}
- 覆盖方法: 就是子类重写父类的方法,要想在子类中调用超类中被覆盖掉的方法就需要用 super 关键字
Employee类和Manager类
Employee类
package com.gang.inheritance;
import java.time.*;
public class Employee {
private String name;
private double salary;
private LocalDate hireDay;
public Employee(String name, double salary, int year, int month,int day) {
this.name = name;
this.salary = salary;
hireDay = LocalDate.of(year,month,day);
}
public String getName() {
return name;
}
public double getSalary() {
return salary;
}
public LocalDate getHireDay() {
return hireDay;
}
public void raiseSalary(double byPercent){
double raise = salary * byPercent / 100;
salary += raise;
}
}
Manager类
package com.gang.inheritance;
public class Manager extends Employee{
private double bonus;
public Manager(String name, double salary, int year, int month, int day) {
super(name, salary, year, month, day);
bonus = 0;
}
public double getSalary() {
double baseSalary = super.getSalary();
return baseSalary +bonus;
}
public void setBonus (double b){
bonus = b;
}
}