JAVA和Nginx 教程大全

网站首页 > 精选教程 正文

java 核心技术-12版 卷Ⅰ- 5.1.2 覆盖方法

wys521 2024-11-28 09:00:40 精选教程 21 ℃ 0 评论

原文

5.1.2 覆盖方法

超类中的有些方法对子类 Manager 并不一定适用。具体来说,Manager 类中的 getSalary 方法应该返回薪水和奖金的总和。为此,需要提供一个新的方法来覆盖 (override) 超类中的这个方法:

public class Manager extends Employee{

	public double getSalary(){

	/// 新的实现,应该是奖金和工资的总和
	}
}
  

应该如何实现这个方法呢?乍看起来似乎很简单,只要返回 salary 和 bonus 字段的总和就可以了:

public double getSalary(){
	return salary + bonus; // won't work, 不行
}

不过,这样做是不行的。回想一下,只有 Employee 方法能直接访问 Employee 类的私有字段。这意味着,Manager类的 getSalary 方法不能直接访问 salary 字段。如果 Manager 类的方法想要访问那些私有字段,就必须像所有其他方法一样使用公共接口,在这里就是要使用 Employee类中的公共方法getSalary。

现在,再试一下。你需要调用 getSalary 方法而不是直接访问 salary 字段:

public double getSalary(){

	double baseSalary = getSalary(); // still won't work .还是不行
	return baseSalary + bonus;
}

上面这段代码仍然有问题。问题出现在调用 getSsalary 的语句上,它只是在调用自身,这是因为 Manager类也有一个 getSalary 方法(就是我们正在实现的这个方法),所以这条语句将会导致无限地调用自己,直到整个程序最终崩溃。

这里需要指出: 我们希望调用超类 Employee 中的 getSalary 方法,而不是当前类的这个方法。为此,可以使用特殊的关键字 super 解决这个问题:

super.getSalary()

这个语句调用的是 Employee 类中的 getSalary 方法。下面是 Manager 类中 getSalary 方法的正确版本:

public double getSalary(){
	double baseSalary = super.getSalary();
  return baseSalary + bonus;

}

注释:有些人认为 super 与 this 引用是类似的概念,实际上,这样对比并不太恰当。这是因为 super 不是一个对象的引用,例如,不能将值 super 赋给另一个对象变量。事实上,super 只是一个指示编译器调用超类方法的特殊关键字。

正如前面所看到的那样,子类可以增加字段、增加方法或覆盖超类的方法,不过,继承绝对不会删除任何字段或方法。

C++注释:在Java 中使用关键字 super 调用超类的方法,而在C++ 中则采用超类名加::操作符的形式。例如,Manager 类的 getSalary 方法要调用 Employee::getSalary而不

是 super.getSalary。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表