2014-02-16 3 views
0

Мы хотим, чтобы заплатить, чтобы показать на экране, когда мы выполняем приложение, но все это показывает, что даже при расчетах сданных в коде мы только получаем:класс Employee с твист

EARNED: 0,0

Как вы можете видеть, есть некоторые элементы других классов, но не стоит беспокоиться, так как они работают так, как мы ожидали, за исключением класса HourlyEmployee.

HourlyEmployee класс:

class HourlyEmployee extends Employee 
{ 
    private double wage; // wage per hour 
    private double hours;// hours worked for week 
    private double earnings= hours *wage; 

    // five-argument constructor 
    public HourlyEmployee(String first, String last,double payMe, 
     double hourlyWage, double hoursWorked) 
    { 
     super(first, last); 
     setWage(hourlyWage); // validate and store hourly wage 
     setHours(hoursWorked); // validate and store hours worked 
     payMe = earned(); 
    } // end five-argument HourlyEmployee constructor 

    // set wage 
    public void setWage(double hourlyWage) 
    { 
     wage = (hourlyWage < 0.0) ? 0.0 : hourlyWage; 
    } // end method setWage 

    // return wage 
    public double getWage() 
    { 
     return wage; 
    } // end method getWage 

    // set hours worked 
    public void setHours(double hoursWorked) 
    { 
     hours = ((hoursWorked >= 0.0) && (hoursWorked <= 120.0)) ? 
     hoursWorked : 0.0; 
    } // end method setHours 

    // return hours worked 
    public double getHours() 
    { 
     return hours; 
    } // end method getHours 

    // calculate earnings; override abstract method earnings in Employee 

    public double earned() 
    { 
     if (getHours() <= 40) // no overtime 
     return getWage() * getHours(); 
     else 
     return 40 * getWage() + (getHours() - 40) * getWage() * 1.5; 
    } // end method earnings 

    @Override 
    public double getPaymentAmount() 
    { 
     return earnings; 
    } 

    // return String representation of HourlyEmployee object 
    @Override 
    public String toString() 
    { 
     return String.format("hourly employee: %s\n%s: $%f\n %s: %f", 
     super.toString(), "hourly wage", getWage(), 
     "hours worked", getHours()); 
    } // end method toString 
} // end class HourlyEmployee 

Класс Тест:

public class Test 
{ 
    public static void main(String args[]) 
    { 
     // create subclass objects           
     MonthlyEmployee salariedEmployee =         
     new MonthlyEmployee("John", "Smith", 800.00); 

     HourlyEmployee commissionEmployee = new HourlyEmployee("Sue", "Jones", 10000,  23.9, 5.7); 

     MonthlyEmployee worker3 = new MonthlyEmployee("Oliver" , "Queen" , 12500); 


     System.out.println("Employees processed individually:\n"); 
     System.out.printf("%s\n%s: %f\n\n",salariedEmployee, "earned",  salariedEmployee.getPaymentAmount()); 

     System.out.printf("%s\n%s : $%f\n]n" , worker3 , "earned" , worker3.getPaymentAmount()); 


     System.out.printf("%s\n%s: %f\n\n",commissionEmployee, "earned",  commissionEmployee.getPaymentAmount()); 


     // create four-element Employee array 
     Employee employees[] = new Employee[ 3 ]; 

     // initialize array with Employees   
     employees[ 0 ] = salariedEmployee;   

     employees[ 1 ] = commissionEmployee; 

     employees [2] = worker3; 


     System.out.println("Employees processed polymorphically:\n"); 

     // generically process each element in array employees 
     // end for 

     // get type name of each object in employees array 
     for (int j = 0; j < employees.length; j++)  
     System.out.printf("Employee %d is a %s\n", j, 
      employees[ j ].getClass().getName());  
    } // end main 
} // end class PayrollSystemTest 

ответ

3
private double earnings= hours *wage; 

Это не так, как первенствовать, не следует ожидать значение пересчитывается каждый раз, hours или wage изменение.

Поскольку значение по умолчанию для double равно 0.0, вот почему earnings равно 0.0.

Вы должны инициализировать это значение после того, как вы инициализируетесь hours и wage, скорее всего, в конструкторе:

public HourlyEmployee(String first, String last,double payMe, 
     double hourlyWage, double hoursWorked){ 
     super(first, last); 
     setWage(hourlyWage); // validate and store hourly wage 
     setHours(hoursWorked); // validate and store hours worked 
     payMe = earned(); 
     earnings= hours *wage; 
} 

Но я стараюсь именно то, что это то, что значение будет пересчитывается каждый время или изменение заработной платы

Как указано в комментариях, вы можете избавиться от переменной earnings и вернуть значение в getPaymentAmount

@Override 
public double getPaymentAmount() { 
    return hours*wage; 
} 
+0

Я понимаю, что вы имеете в виду и благодарите вас за понимание. Но я стараюсь именно это, это то, что значение будет пересчитываться каждый раз, когда часы или изменение заработной платы. Извините за ввод в заблуждение. Есть ли способ сделать такую ​​вещь, или я нахожусь в дурацком поручении? –

+0

@TimDrake Затем вам придется изменять это значение каждый раз, когда часы или изменения заработной платы (в ваших сеттерах часами и зарплатой, обновлять их), или вы можете вернуть это значение только тогда, когда вам нужно, то есть сделать умножение в другом методе, который вы вызовет, чтобы получить это значение. –

+1

@TimDrake Я бы предложил полностью избавиться от поля и вернуть вычисление при вызове 'getPaymentAmount()'. –

Смежные вопросы