抽象类Java为什么我的程序只打印0.00?

抽象类Java为什么我的程序只打印0.00?,java,abstract-class,Java,Abstract Class,抽象类Java为什么我的程序只打印0.00 public class TestEmployee { public static void main(String[] args) { Employee[] folks = new Employee[4]; folks[0] = new SalariedEmployee("Suzy",123,520000.00); folks[1] = new WageEmployee("Fred

抽象类Java为什么我的程序只打印0.00

public class TestEmployee
{
    public static void main(String[] args)
    {
        Employee[] folks = new Employee[4]; 

        folks[0] = new SalariedEmployee("Suzy",123,520000.00); 
        folks[1] = new WageEmployee("Fred",456,7.50,40);  
        folks[2] = new SalariedEmployee("Harry",234,45000.00);
        folks[3] = new WageEmployee("Rita",345,7.76,38);

        for(int i=0; i<folks.length; i++)  
        {
            System.out.println(folks[i].getName()
            + " earns " + folks[i].getMonthlyPay() + " each month");
        }
    }
}
请解释一下为什么我的程序只打印零。我想这就是我的问题所在

class SalariedEmployee extends Employee
{
    private double yearSalary;

    public SalariedEmployee(String name, int number, double salary)
    {
        super(name, number, salary);
        yearSalary = getMonthlyPay();
    }

    public double getMonthlyPay()
    {
        double monthlyPay = yearSalary / 12;
        return monthlyPay;
    }

    public String toString()
    {
        return(super.getName() + ", " + super.getNumber() + ", " + getMonthlyPay());
    }

}

class WageEmployee extends Employee
{
    private double wage;
    private int hours;

    public WageEmployee(String name, int number, double salary, int hours)
    {
        super(name, number, salary, hours);
    }

    public double getMonthlyPay()
    {
        double monthlyPay = wage * hours * 4;
        return monthlyPay;
    }

    public String toString()
    {
        return(super.getName() + ", " + super.getNumber() + ", " + getMonthlyPay());
    }
}

追溯0.00的来源并不太困难

在for loop In main中,您使用
peops[i].getMonthlyPay()
获取要打印的数字。因此,让我们研究一下
getMonthlyPay()
的实现。有两种实现,一种在
受薪员工
中,另一种在
受薪员工

如果是
SalariedEmployee
getMonthlyPay
方法使用字段
yearSalary
的值。将哪个值分配给
年薪
?您是否已使用编辑器或IDE查找所有出现的
yearlary
,以查看分配给它的值的位置。你会发现它在任何地方都不会发生。因为
yearlary
是一个字段(更准确地说,是一个实例变量),所以Java从一开始就为它赋值0.00(方法中的局部变量是不同的)。由于从未分配任何其他值,因此当
getMonthlyPay()
将其除以12并返回结果时,该值仍然为0.00。这就是0.00的来源。你能找到一个解决办法吗


对于
WageEmployee
-您应该自己尝试同样的练习,在
WageEmployee.getMonthlyPay()
中找出值的来源。这一次,您需要找出
工资
的值以及
小时
的值的来源。愉快的搜索。

这是学习使用调试器的最佳时机,使用此工具可以帮助您首先识别并解决错误。作为旁注,在向本网站或任何网站发布代码以寻求帮助时,您应该努力将其格式化,以便人们能够阅读。这包括对代码进行适当的常规缩进。
public WageEmployee(字符串名称、整数编号、双薪、整数小时)
。。。我在父类
Employee
中没有看到兼容的已定义构造函数。您设置了
yearlary=getMonthlyPay()
,并且
getMonthlyPay()
被定义为
monthlyPay=yearlary/12
。那么年薪取决于月薪,月薪取决于年薪?这已经没有什么意义了。另外,我看不到在哪里初始化
yearSalary
变量。Chit,您正在为构造函数中的参数赋值——不要这样做。正在寻找重复项以结束此操作。您认为
员工
构造函数的
双薪
参数在做什么,您为什么这么认为?当构造函数结束时,您认为参数的值存储在何处,为什么您这样认为?
class SalariedEmployee extends Employee
{
    private double yearSalary;

    public SalariedEmployee(String name, int number, double salary)
    {
        super(name, number, salary);
        yearSalary = getMonthlyPay();
    }

    public double getMonthlyPay()
    {
        double monthlyPay = yearSalary / 12;
        return monthlyPay;
    }

    public String toString()
    {
        return(super.getName() + ", " + super.getNumber() + ", " + getMonthlyPay());
    }

}

class WageEmployee extends Employee
{
    private double wage;
    private int hours;

    public WageEmployee(String name, int number, double salary, int hours)
    {
        super(name, number, salary, hours);
    }

    public double getMonthlyPay()
    {
        double monthlyPay = wage * hours * 4;
        return monthlyPay;
    }

    public String toString()
    {
        return(super.getName() + ", " + super.getNumber() + ", " + getMonthlyPay());
    }
}