系列文章目录
Java核心技术卷一 -第一章:java“白皮书”的关键术语
Java核心技术卷一 -第三章:数据类型
Java核心技术卷一 -第三章:变量与常量
Java核心技术卷一 -第三章:运算符
Java核心技术卷一 -第三章:字符串
Java核心技术卷一 -第三章:输入与输出
Java核心技术卷一 -第三章:数组
Java核心技术卷一 -第四章:类之间的关系-依赖
Java核心技术卷一 -第四章:预定义类-LocalDate类小应用
Java核心技术卷一 -第四章:构造器
Java核心技术卷一 -第四章:null引用
Java核心技术卷一 -第四章:方法参数
Java核心技术卷一 -第四章:对象构造
文章目录
- 系列文章目录
- 前言
- 一、覆盖方法与super
- 总结
前言
本人为java初学者,文章内容仅为个人学习总结分享,其中包含了大量Java核心技术卷一里面的文章内容以及一些网站文章内容,由于参考文章过多,在此并不一一列出,如有侵权,请联系删除。
一、覆盖方法与super
我们知道在Java中,类是可以继承的,使用关键字extends,其中继承的新类叫“子类”,被继承的类叫“父类/超类”,但是有时超类中的有些方法对子类并不一定适用。举例来说,像(父类:Employee,子类: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;
}
上面这段代码仍然有问题。问题出现在调用getSalary的语句上,它只是在调用自身,这是因为Manager类也有一个getSalary方法(就是我们正在实现的这个方法),所以这条语句将会导致无限次地调用自己,直到整个程序最终崩溃。
这里需要指出:我们希望调用超类Employee中的getSalary方法,而不是当前类的这个方法。为此,可以使用特殊的关键字super解决这个问题:
super.getSalary()
这个语句调用的是Employee类中的getSalary方法。下面是Manager类中getSalary方法的正确版本:
public double getSalary()
{
double baseSalary = super.getSalary();
return baseSalary + bonus;
}
总结
以上就是本文的内容,记录了一些关于java“覆盖方法与super”的内容,
其实本文的重点是在子类调用父类的方法,也就是“super.方法”。本人也是刚开始接触java,不能保证总结内容的正确性,若是有错误的话,欢迎大家指出,谢谢!