#java #arraylist #abstract
#java #arraylist #аннотация
Вопрос:
Я создал класс Employee, используемый для расчета по еженедельной оплате в качестве абстрактного. Затем я создал 2 подкласса для зарплатных и почасовых сотрудников. Проблема, с которой я сталкиваюсь, заключается в том, что мой тестовый класс не распечатывает список массивов, а затем извлекает правильную оплату раз в две недели. Мог помочь другой набор глаз.
/** Employee class with abstract method*/
public abstract class Employee {
public String fullName;
/** construct a default employee object*/
public Employee() {
}
public String getFullName() {
return fullName;
}
public void setFullName(String fullName) {
this.fullName = fullName;
}
/** abstract method getBIWeeklyPay */
public abstract double getBiWeeklyPay();
public void printgetBiWeeklPay() {
System.out.println("Employee " this.fullName "'s" "Bi-weekly pay is:");
}
}
/**Salary Class*/
public class SalaryEmployee extends Employee {
public SalaryEmployee() {
}
public double salary;
public double getBiWeeklyPay() {
return salary/(52*2) ;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
}
/** Hourly Class*/
public class HourlyEmployee extends Employee {
public double hourlyRate;
public double hoursPerWeek;
public HourlyEmployee() {
}
public double getBiWeeklyPay() {
return hourlyRate * (hoursPerWeek *2);
}
public double getHourlyRate() {
return hourlyRate;
}
public void setHourlyRate(double hourlyRate) {
this.hourlyRate = hourlyRate;
}
public double getHoursPerWeek() {
return hoursPerWeek;
}
public void setHoursPerWeek(double hoursPerWeek) {
this.hoursPerWeek = hoursPerWeek;
}
}
/**Test Class*/
import java.util.*;
public class EmployeeTest {
public static void main(String[] args){
ArrayList<Employee> employees = new ArrayList<Employee>();
SalaryEmployee mike = new SalaryEmployee();
mike.setFullName("Mike Burns");
mike.setSalary(75000.00);
employees.add(mike);
HourlyEmployee tim = new HourlyEmployee();
tim.setFullName("Tim Globe");
tim.setHourlyRate(12.00);
tim.setHoursPerWeek(40.00);
employees.add(tim);
print(employees);
}
public static void print(ArrayList<Employee> employees){
for(Employee e: employees){
e.printgetBiWeeklyPay();
}
}
}
Комментарии:
1. Вы пробовали использовать отладчик?
2. Кроме того, я почти уверен
ArrayList
, что у него нетprintBiWeeklyPay()
метода…3. Да, есть 2 ошибки, ему не нравится основной метод в тесте, он получает какое-то исключение, а затем не может разрешить печать. Bieklypay(); в список массивов, даже если он должен принадлежать абстрактному и каждому другому методу (зарплата / почасовая оплата).
4. Вам нужно будет быть более конкретным, чем
it doesn't like the Main method
и особенно для «он получает какое-то исключение».5. Код даже не компилируется в первую очередь, потому что в ArrayList нет функции printBiWeeklyPay
Ответ №1:
ваш var employees имеет тип ArrayList, но ArrayList не имеет функции printBiWeeklyPay .
вместо этого вы должны создать свою собственную функцию printBiWeeklyPay, которая принимает ArrayList в качестве параметра и вызывает его вместо этого.
Примером может быть:
public void printByWeeklyPay(ArrayList<Employee> list) {
for (Employee e : list) {
System.out.println(e.toString());
}
}
Также вам придется переопределить #toString() в ваших классах Employee, чтобы вернуть некоторый соответствующий вывод.
Ответ №2:
public static void main(String args[]) {
ArrayList<Employee> employees = new ArrayList<Employee>();
employees.add(john); // hourly employee
employees.add(fred); // salary employee
employees.add(bob); //hourly employee
print(employees);
}
public static void print(ArrayList<Employee> employees) {
for each employee in employees {
employee.printBiWeeklyPay();
}
}
Комментарии:
1. Это довольно близко к тому, что делает данный ответ… Перебирает сотрудников в списке и печатает каждого из них. Однако вам нужно будет определить
printBiWeeklyPay()
метод для этого типаEmployee
.2. Ну, если вы хотите печатать bieklypay(), вам нужно что-то, что будет печатать, верно?
3. 🙂 да, глупый я, теперь у меня есть оператор System.out.print() как часть этого метода. Однако, поскольку оператор печати находится в классе «Employee», и именно там находится аннотация для ‘getBiWeeklyPay’, как заставить его получать от сотрудников определенный тип оплаты, т.Е. зарплату или почасовую. К вашему сведению, я вернулся и сделал их все одинаковыми, я заметил, что я использовал getBiweeklyPay в sper и подклассах, так что теперь я сделал этот шаг.
4. Если я правильно понимаю, ваш переопределенный
getBiWeeklyPay()
должен позаботиться о зарплате / почасовой оплате5. Да, это должно быть, но я, похоже, не могу вызвать его в инструкции print, поэтому при вызове метода print в тесте он не выполнит вычисление. Я обновлю весь код из моего первоначального сообщения.