1.对重写与重载的理解
重写是在继承的基础上,子类中再次写出父类中的一个或多个方法的操作。
父类Programer中的有些方法对于子类Manager并不一定适用,如Manager中的getSalary方法应该返回薪水和奖金的总和。因此,需要一个新的方法来覆盖(重写)父类Programer中的这个方法:
/**
* 程序员类
属性:姓名 工号 工资
行为:工作work(打印姓名、工号、工资)
* @author dell
*
*/
public class Programer {
private String name ;
private int num ;
private double salary ;
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
public void setName(String name) {
this.name = name;
}
public void setNum(int num) {
this.num = num;
}
// public Programer(String name,int num,double salary )
// {
// this.name = name;
// this.num = num;
// this.salary = salary;
// }
public Programer(String name,int num,double salary )
{
this.setName(name);
this.setNum(num);
this.setSalary(salary);
}
public String getName()
{
return name;
}
public int getNum()
{
return num;
}
}
/**
* 项目经理类
属性:姓名 工号 工资 奖金
行为:工作work(打印姓名、工号、工资、奖金)
* @author dell
*
*/
public class Manager extends Programer
{
private double bonus;//奖金
public Manager(String name, int mum, double salary)
{
super(name, mum, salary);
bonus = 0;
}
public double getSalary()
{
double baseSalary = super.getSalary();
return baseSalary + bonus;
// return salary+bonus; //won't work 这是因为Manager类的getSalary方法不能够直接访问父类Programer的私有域,如果Manager类的方法一定要访问私有域,
// 就必须借助公有的接口,Programer类正是这样一个接口
// double baseSalary = getSary(); //这条语句将会导致无限的调用自己,直到整个程序崩溃为止
/*
* 我们希望调用的是父类Programer中的方法,而不是当前类的这个方法。为此使用特定的关键字super解决这个问题
*/
}
public void setBonus(double a)
{
bonus = a;
}
}
重载是在一个类中方法名相同,但其中的部分参数不同
编译器必须挑选出具体执行哪个方法,它通过用各个方法给出的参数类型与特定方法调用所使用的值类型进行匹配来挑选出相应的方法。