Мы хотим, чтобы заплатить, чтобы показать на экране, когда мы выполняем приложение, но все это показывает, что даже при расчетах сданных в коде мы только получаем:класс 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
Я понимаю, что вы имеете в виду и благодарите вас за понимание. Но я стараюсь именно это, это то, что значение будет пересчитываться каждый раз, когда часы или изменение заработной платы. Извините за ввод в заблуждение. Есть ли способ сделать такую вещь, или я нахожусь в дурацком поручении? –
@TimDrake Затем вам придется изменять это значение каждый раз, когда часы или изменения заработной платы (в ваших сеттерах часами и зарплатой, обновлять их), или вы можете вернуть это значение только тогда, когда вам нужно, то есть сделать умножение в другом методе, который вы вызовет, чтобы получить это значение. –
@TimDrake Я бы предложил полностью избавиться от поля и вернуть вычисление при вызове 'getPaymentAmount()'. –