【问题标题】:Beginner Question about java superclasses and subclasses关于java超类和子类的初学者问题
【发布时间】:2021-03-04 14:29:19
【问题描述】:

我对 java 类中的实例变量有疑问。

我有以下类 Employer.java

public class Employee {
    String name = "";
    public double salary = 0;

    public double getEarnings() {
        System.out.println("Super Earnings: " + salary);
        return salary;
    }
}

这是我作为 Employer 子类的 Manager 类:

public class Manager extends Employee {
    public double bonus;
    public double salary = 0;

    @Override
    public double getEarnings() {
        return super.getEarnings() + bonus;
    }
}

在主函数中,我尝试设置奖金,我有以下代码:

public class App {
    public static void main(String[] args) throws Exception {
        Manager myMan01 = new Manager();
        myMan01.name = "Mike";
        myMan01.salary = 3000;
        myMan01.bonus = 2000;
        System.out.println(myMan01.getEarnings());
        System.out.println(myMan01.salary);
    }
}

我预计输出是 5000。但实际上是 2000。

我知道我已经在超类和子类中实例化了薪水变量,这似乎是导致输出的原因。我只是不明白,为什么myMan01.salary 不被super.getEarnings() 调用。谁能解释一下?

在此先感谢,并对格式表示抱歉。很多东西要学,仍然:)

【问题讨论】:

  • 请添加代码,您如何实例化myMan01 实例。您在代码中的何处指定了 super.getEarnings() 调用?
  • Manager#getEarnings() 中的result 变量是什么?你的意思是salary 吗?
  • 我编辑了那部分。代码有点不同。通过将其更改为简洁,我犯了一个错误。
  • 这里的问题叫做shadowing。您有两个完全独立的字段,均名为salary

标签: java inheritance instance instance-variables


【解决方案1】:

您的代码中没有名为result 的变量。我想你在那里打错了。

public class Manager extends Employee {
    public double bonus;
    public double salary = 0;

    @Override
    public double getEarnings() {
        return this.salary + this.bonus;
    }
}

创建实例变量private 访问修饰符并为每个变量使用gettersetter 方法来关联它们总是好的。 (OOP中的封装)

【讨论】:

  • 抱歉,打错了。输出仍然不是我的预期。
【解决方案2】:

在你的 Manager 类的 getEarnings() 方法中,我认为你有错字,你返回 result + bonus 而不是 salary + bonus

您不需要salary 变量,它继承自Employee 类。

【讨论】:

    【解决方案3】:

    为了将问题标记为已回答,我将背诵一些 cmets。

    这个问题的答案似乎是多态性(虽然作为初学者我必须等到我教科书后面的章节才能完全理解)。

    • 您在这里遇到的问题称为阴影。您有两个完全独立的字段,都命名为薪水。 – chrylis -cautiouslyoptimistic- 1 小时前

    • Hiding Fields in Java Inheritance 可能重复

    正如 chrylis(谨慎乐观)和 Joe 的 cmets 所说。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-12
      • 2018-01-08
      • 2011-02-21
      • 2023-01-24
      相关资源
      最近更新 更多