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

ohtdti5x  于 2021-07-11  发布在  Java
关注(0)|答案(4)|浏览(279)

我有一个关于java类中示例变量的问题。
我有下面的类employer.java

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

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

以下是我的经理类作为雇主的一个子类:

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

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

在main函数中,我尝试设置奖金,代码如下:

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年。
我知道我已经在超类和子类中示例化了salary变量,这似乎导致了输出。我只是不明白,为什么 myMan01.salary 不是由调用的 super.getEarnings() . 谁能澄清一下吗?
提前谢谢,抱歉格式化。还有很多东西要学:)

fdx2calv

fdx2calv1#

没有称为 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方法与之关联(封装(面向对象)

cigdeys3

cigdeys32#

在你的 getEarnings() 方法在你的经理类我想你有一个输入错误,你返回 result + bonus 而不是 salary + bonus !
你不需要 salary 变量,它是从 Employee 班级。

gfttwv5a

gfttwv5a3#

为了把问题标记为已回答,我将背诵一些评论。
这个问题的答案似乎是多态性(尽管作为一个初学者,我必须等到我的教科书后面的章节才能完全理解)。
这里的问题叫做阴影。您有两个完全不同的字段,均命名为salarychrylis-谨慎乐观-1小时前
java继承中隐藏字段的可能重复
正如chrylis-谨慎的光学学家-和joe的评论所说。

eqqqjvef

eqqqjvef4#

注解掉下面显示的行以获得预期结果:

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

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

这个 double salaryManager 正在隐藏 double salaryEmployee 班级。
这个问题也存在于同一个主题上。您还可以检查这个以获得更多示例。

相关问题