Java子类重写父类方法(附带实例)
Java 程序中,有时需要在子类中修改父类(父类)的方法。
例如,假设 Employee 类中的 getSalary() 方法用于报告雇员的薪水总额,Manager 作为 Employee 的子类,那么继承得来的方法并不适合 Manager 类。因此,需要重写(override)该方法,使其返回经理的薪水和奖金的总和:
这里需要注意,子类方法不能直接访问父类的私有实例变量。这就是为什么 Manager.getSalary() 方法需要调用公有的 Employee.getSalary() 方法。这里的 super 关键字用于调用父类方法。
在重写方法时,必须注意与参数类型完全匹配。例如,假设 Employee 类有一个方法:
假设定义了一个方法:
重写方法时,可以将返回类型更改为子类型(从技术上讲,允许返回类型协变)。例如,如果 Employee 类有一个方法:
例如,假设 Employee 类中的 getSalary() 方法用于报告雇员的薪水总额,Manager 作为 Employee 的子类,那么继承得来的方法并不适合 Manager 类。因此,需要重写(override)该方法,使其返回经理的薪水和奖金的总和:
public class Manager extends Employee { ... public double getSalary() { // Overrides superclass method return super.getSalary() + bonus; } }这个方法调用了父类的方法,通过父类的方法得到薪水,并在此基础上加上奖金。
这里需要注意,子类方法不能直接访问父类的私有实例变量。这就是为什么 Manager.getSalary() 方法需要调用公有的 Employee.getSalary() 方法。这里的 super 关键字用于调用父类方法。
重写方法时并不需要调用父类方法,但这样做很常见。注意,与 this 不同的是,super 不是一个对象的引用,而是绕过动态方法查找并调用特定方法的指令。
在重写方法时,必须注意与参数类型完全匹配。例如,假设 Employee 类有一个方法:
public boolean worksFor(Employee supervisor)如果在 Manager 类中重写此方法,则无法更改参数类型,即使肯定不会有经理向普通雇员汇报工作。
假设定义了一个方法:
public class Manager extends Employee { ... public boolean worksFor(Manager supervisor) { ... } }这只是一个新方法,现在 Manager 有两个单独的 worksFor 方法。可以通过使用 @Override 注解来标记那些意图重写父类方法的方法,以确保不出现这种类型的错误:
@Override public boolean worksFor(Employee supervisor)如果你犯了错误,并且正在定义新方法,编译器将报告错误。
重写方法时,可以将返回类型更改为子类型(从技术上讲,允许返回类型协变)。例如,如果 Employee 类有一个方法:
public Employee getSupervisor()则 Manager 类可以使用以下方法来重写它:
@Override public Manager getSupervisor()重写方法时,子类方法必须至少与父类方法具有一样的可访问性。特别是,如果父类方法是公有的,那么子类方法也必须声明为公有的。不小心忘记子类方法的 public 修饰符是一个常见错误。然后编译器会因为较弱的访问权限而报错。