网站首页 > 精选教程 正文
原文
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。
猜你喜欢
- 2024-11-28 java 核心技术-12版 卷Ⅰ- 5.2.3相等测试与继承
- 2024-11-28 java 核心技术-12版 卷Ⅰ- 5.2.4 hashCode方法
- 2024-11-28 Java入门书单
- 2024-11-28 java 核心技术-12版 卷Ⅰ- 4.3.7 隐式参数与显式参数
- 2024-11-28 全网最完整的免费java教程讲义系列(四)——java的流程控制
- 2024-11-28 java 核心技术-12版 卷Ⅰ- 4.6 对象构造 4.6.1重载
- 2024-11-28 java 核心技术-12版 卷Ⅰ- 3.10 数组
- 2024-11-28 java 核心技术-12版 卷Ⅰ- 4.3 自定义类
- 2024-11-28 2019年Java核心技术我整理了200多页pdf,今天分享给你
- 2024-11-28 java 核心技术12版卷1 - 1.3 Java applet 与 Internet
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)