继承——以工资管理系统为例
1.定义子类
用extends定义子类
子类自动继承超类中的所有方法,比超类封装更多的代码
一般将普遍的功能放在超类,更特殊的方法放在子类
2.覆盖方法
覆盖超类中对子类不适用的方法
关键字super.getSalary()表示调用超类中的getSalary()方法
3.子类构造器
子类的构造器不能访问超类的私有字段,故必须通过一个构造器来初始化这些私有片段
使用super调用构造器的语句必须是子类构造器的第一条语句
若子类构造器未显式调用超类的构造器,将自动调用超类的无参数构造器
4.多态
对象变量是多态的,如,一个Employee类对象可以调用Employee类型的对象,也可以调用其任何子类类型的对象
注意:不能把超类的引用赋给子类变量e.g. Manager m = staff[i],这样会使所有职员变量都变成经理变量
package interitance;
public class ManagerTest {
public static void main(String[] args) {
Manager boss = new Manager( "Carl Cracker",80000,1987,12,15 );
boss.setBonus( 5000 );
Employee[] staff = new Employee[3];
//在数组中混合加入经理和员工
staff[0] = boss;
//staff[0]和boss引用同一个对象,但只把staff[0]看作Employee对象,但boss是Manager对象
//注意:不能把超类的引用赋给子类变量e.g. Manager m = staff[i];
staff[1] = new Employee( "Harry Hacker",50000,1989,10,1 );
staff[2] = new Employee( "Tommy Tester",40000,1990,3,15 );
for (Employee e:staff)
System.out.println("name= "+e.getName()+",salary = "+e.getSalary());
//e.getSalary()能够选出应该执行的正确getSalary()方法
//staff[0]是Manager对象,所以会调用Manager类里的getSalary方法
}
}
package interitance;
//用extends定义子类
//子类自动继承超类中的所有方法,比超类封装更多的代码
//一般将普遍的功能放在超类,更特殊的方法放在子类
public class Manager extends Employee {
private double bonus;
public Manager(String name,double salary,int year,int month,int day){
//调用超类Employee中带有name,salary,year,month,day参数的构造器
super(name,salary,year,month,day);
bonus = 0;
}
public double getSalary(){
double baseSalary = super.getSalary();
//覆盖超类中对子类不适用的方法
//关键字super.getSalary()表示调用超类中的getSalary()方法
return baseSalary +bonus;
}
public void setBonus(double b){ bonus = b; }
}
package interitance;
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;
LocalDate hireDay = LocalDate.of( year,month,day );
}
public void raiseSalary(double byPercent){
double raise = salary * byPercent / 100;
salary += raise;
}
public String getName(){ return name; }
public double getSalary(){ return salary; }
public LocalDate getHireDay(){ return hireDay; }
}