java覆盖方法

  • 现假设有一个Employee(雇员类)和Manager(经理类),其中Employee中有一个薪资getSalary()方法及加薪raiseSalary()方法,Manager有一个奖金setBonus ()方法.
  • Manager继承Employee

Manager类中的getSalary()方法应该返回薪资和奖金的总和.所以需要在Manager中提供一个新的方法来覆盖超类Employee中的方法

public class Manager extends  Employee{
    .
    .
    public double getSalary() {
       .
       .
    }
}
  • 具体该如何实现???
  • 看起来感觉很简单,只要返回salary和 bonus 的总和就可以
 public double getSalary() {
        return salary + bonus; //报错
    }
  • 因为Manager 类的 getSalary 方法不能直接访问超类的私有域
  • 如果Manager类的方法一定要访问私有域,就必须借助于共有的接口

2.将对salary域的访问替换成调用 getSalary 方法

public double getSalary() {
        double baseSalary = getSalary(); //报错
        return baseSalary +bonus;
    }
  • 这样仍然无法运行,因为Manager 类也有一个 getSalary 方法(就是正在实现的方法),所以这条语句将会导致无限次调用自己,直到程序崩溃
  • 在这里,我们需要希望调用超类 Employee 中的方法,而不是当前类的方法.
  • 因此需要 super 关键字
  1. 正确的调用超类中的getSalary()
public double getSalary() {
        double baseSalary = super.getSalary(); //报错
        return baseSalary +bonus;
    }
  • 覆盖方法: 就是子类重写父类的方法,要想在子类中调用超类中被覆盖掉的方法就需要用 super 关键字

Employee类和Manager类

Employee类

package com.gang.inheritance;

import java.time.*;

public class Employee {
    private String name;
    private double salary;
    private LocalDate hireDay;

    public Employee(String name, double salary, int year, int month,int day) {
        this.name = name;
        this.salary = salary;
        hireDay = LocalDate.of(year,month,day);
    }

    public String getName() {
        return name;
    }

    public double getSalary() {
        return salary;
    }

    public LocalDate getHireDay() {
        return hireDay;
    }
    public void raiseSalary(double byPercent){
        double raise = salary * byPercent / 100;
        salary += raise;
    }
}


Manager类

package com.gang.inheritance;

public class Manager extends  Employee{
    private double bonus;

    public Manager(String name, double salary, int year, int month, int day) {
        super(name, salary, year, month, day);
        bonus = 0;
    }

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

    }
    public void setBonus (double b){
        bonus = b;
    }

}


  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值