关于 java 超类和子类的初学者问题

Beginner Question about java superclasses and subclasses

我对 java classes.

中的实例变量有疑问

我有以下classEmployer.java

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

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

这是我的经理 class 作为雇主的下属class:

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。

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

提前致谢,抱歉格式化。还有很多东西要学:)

在您的经理 getEarnings() 方法中 class 我认为您有错字,您 return result + bonus 而不是 salary + bonus !

而且您不需要 salary 变量,它是从 Employee class.

继承的

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

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

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

创建实例变量 private 访问修饰符并使用 getter & setter[= 总是好的19=] 为每个变量关联的方法。 (OOP 中的封装)

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

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

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

  • 可能与 Hiding Fields in Java Inheritance

    重复

正如 chrylis -cautiouslyoptimistic- 和 Joe 的评论所述。