super 关键字的两个用途
在学java核心技术这本书时,在超类和子类部分,看到了对super关键字的讲述,在此总结一下
1、 调用超类的方法
例如,超类是 Employee,包含私有域:name、salary和 hireDay;包含方法 getSalary,getName、getHireday;
子类是 manager,继承上述三个私有域,新增奖金私有域 bonus;
此时子类 manager 的getSalary 方法与超类 Employee的方法不适应,manager 类中的getSalary方法应该返回 salary (工资)和 bonus(提成)的总和,此时,需要提供一个新的方法来覆盖超类中的这个方法。
一次错误的尝试,如下
public double get Salary()
{
double baseSalary = getSalary();
return baseSalary + bonus;
}
然而,上述代码还是不能成功运行,问题出现在调用getSalary的语句上,因为 manager 中本身就有 getSalary 方法(就是正在实现的这个方法),所以,这条语句会无限次调用自己本身,直到程序崩溃。
所以我们需要能够调用到超类的 getSalary 方法,而不是本类中的 getSalary ,因此利用 super 关键字解决此问题,如下:
public double get Salary()
{
double baseSalary = super.getSalary();
return baseSalary + bonus;
}
在这里需要说明的一点是,super 只是一个指示编译器调用超类方法的关键字,与 this 的引用不太一样。
2、 调用超类的构造器
还是通过上面的超类 Employee 和子类 manager 进行理解
manager 类的构造器是不能访问 Employee 的私有域,所以必须要利用 Employee 类的构造器对这部分私有域进行初始化,通过super 关键字实现对超类构造器的调用。
需要注意的是,使用 super 调用构造器的语句必须是子类构造器的第一条语句。