选用教材:《Java核心技术卷一》
第五章 继承
一、用超类Employee和子类Manager来说明两者的关系
1、主函数部分
package inheritance; public class ManagerTest { public static void main(String[] args) { var boss=new Manager("Carl Cracker",80000,1987,12,15);//Manager是子类 boss.setBonus(5000); var staff=new Employee[3];//Employee是超类 staff[0]=boss; 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()); } }
2、超类Employee部分
package inheritance; import java.time.LocalDate; 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; } }
3、子类Manager部分
package inheritance; public class Manager extends Employee { private double bonus=0; public Manager(String name,double salary,int year,int month,int day) { super(name,salary,year,month,day); } public double getSalary() { double baseSalary=super.getSalary();//重载超类的方法 return baseSalary+bonus; } public void setBonus(double b) { bonus=b; } }
二、一些容易出错的地方
1、命名冲突及编译器的智能功能
当另一个包里有一个同样命名为Employee的公共类时,eclipse可能不会提醒用户,而是直接在程序的最顶上加入一行import该包的语句。
最后我们写出来的程序就会出现诸如类型不匹配等报错信息,这时只需检查程序顶部、删掉import语句即可。
2、将setBonus方法误写为getBonus方法
java的命名规范告诉我们:以set开头的方法是更改器方法,而以get开头的方法是访问器方法。
于是,Bonus值从实例化对象的过程中直接传过来,我们想当然地会认为它是访问器方法。
我的理解是:一开始声明Bonus时就赋值了0,后来不管传来的值是多少,都属于更改了对象的状态,所以它是更改器方法。