[英]Java, Cannot seem to find issue with my inheritence
我正試圖找出我的問題。
由於某些原因,當我嘗試設置銷售人員的銷售時,它只會將第一個SalesPerson建立的銷售設置為最后一個Salesperson銷售。
在這里,EmployeeDatabase擁有EmployeeList,這是Employees類型的容器對象。
我有其他班級的代碼,但我認為這是所有需要的...很抱歉,代碼中缺少注釋
我的輸出:
John 12000.0
Set sales to: 12000.0
Joan 10000.0
Set sales to: 10000.0
Jack 5000.0
Set sales to: 5000.0
Name: John Commision: 0.03 Sales: 5000.0
Name: Joan Commision: 0.04 Sales: 0.0
Name: Jack Commision: 0.02 Sales: 0.0
Payroll: 150.0
代碼:EmployeeDatabase
public class EmployeeDatabase
{
public static void main(String[] args)
{
EmployeeList emp = new EmployeeList();
/*emp.enqueue(new SalesManager("Gee", 1000));
emp.enqueue(new SalesManager("Gal", 1000));
emp.enqueue(new SalesManager("Gem", 1000));*/
emp.enqueue(new SalesPerson("John", 0.03));
emp.enqueue(new SalesPerson("Joan", 0.04));
emp.enqueue(new SalesPerson("Jack", 0.02));
/*emp.enqueue(new Manager("Fred", 10000));
emp.enqueue(new Manager("Frank", 5000));
emp.enqueue(new Manager("Florence", 3000));
emp.enqueue(new Programmer("Linda", 7));
emp.enqueue(new Programmer("Larry", 5));
emp.enqueue(new Programmer("Lewis", 3));*/
/*emp.setHours("Linda", 35);
emp.setHours("Larry", 23);
emp.setHours("Lewis", 3);*/
emp.setSales("John", 12000);
emp.setSales("Joan", 10000);
emp.setSales("Jack", 5000);
/*emp.setSales("Gee", 4000);
emp.setSales("Gal", 3000);
emp.setSales("Gem", 2000);
emp.setSalary("Gee", 1000);
emp.setSalary("Gal", 2000);
emp.setSalary("Gem", 3000);*/
emp.display();
}
}
EmployeeList的
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Queue;
public class EmployeeList
{
Queue<Employee> empList = new LinkedList<Employee>();
Employee find(String nm)
{
Iterator<Employee> it = empList.iterator();
while(it.hasNext())
{
Employee em = (Employee)it.next();
if(!em.name.equals(nm))
{
return em;
}
}
return null;
}
double payroll()
{
double payroll = 0.0;
Iterator<Employee> it = empList.iterator();
while(it.hasNext())
{
Employee em = (Employee)it.next();
payroll += em.computePay();
}
return payroll;
}
void display()
{
Iterator<Employee> it = empList.iterator();
while(it.hasNext())
{
Employee em = (Employee)it.next();
em.display();
}
System.out.println("\nPayroll: " + payroll());
}
void enqueue(Employee e)
{
empList.add(e);
}
void setHours(String nm, int hrs)
{
Employee em = find(nm);
/*if(em == null)
return;*/
em.setHours(hrs);
}
void setSalary(String nm, float salary)
{
Employee em = find(nm);
/*if(em == null)
return;*/
em.setSalary(salary);
}
void setSales(String nm, double sales)
{
System.out.println(nm + " " + sales);
Employee em = find(nm);
/*if(em == null)
return;*/
em.setSales(sales);
}
}
雇員
abstract class Employee
{
String name;
Employee() {}
Employee (String nm) { name = nm; }
abstract double computePay();
void display () {}
void setHours(double hrs) {}
void setSales(double sales) {}
void setSalary(double salary) { System.out.println("NO!"); }
}
WageEmployee
public class WageEmployee extends Employee
{
double rate;
double hours;
WageEmployee(String name)
{
this.name = name;
if(this.name.length() < 14)
{
while(this.name.length() < 14)
{
this.name += " ";
}
}
}
WageEmployee(String name, double rate)
{
this.name = name;
if(this.name.length() < 14)
{
while(this.name.length() < 14)
{
this.name += " ";
}
}
this.rate = rate;
}
double computePay()
{
return rate * hours;
}
void setHours(double hrs)
{
hours = hrs;
System.out.println("Set Hours to: " + hours);
}
void display ()
{
System.out.println("Name: " + name + " Hours: " + hours + " Rate: " + rate);
}
}
業務員
public class SalesPerson extends WageEmployee
{
double comission;
double salesMade;
SalesPerson(String name, double commision)
{
super(name);
this.comission = commision;
}
double computePay()
{
return comission * salesMade;
}
void setSales(double sales)
{
salesMade = sales;
System.out.println("Set sales to: " + salesMade);
}
void display ()
{
System.out.println("Name: " + name + " Commision: " + comission + " Sales: " + salesMade);
}
}
在這段代碼中有兩個問題。
首先,有額外的! 在查找方法中。
if(!em.name.equals(nm))
應該是if(em.name.equals(nm))
。
第二個問題是您的工資雇員構造函數中創建的填充。
if(this.name.length() < 14)
{
while(this.name.length() < 14)
{
this.name += " ";
}
}`
此代碼,以使"John"
你正在尋找的其實是"John "
。 注意間距。 (射擊,降價消除了其中的大部分,但您最終想到了額外的間距)。 這將導致名稱永遠不會相等,從而導致在嘗試使用不存在的員工時出現空指針異常。
有三種可能的解決方案。 首先,在比較之前對em.name
使用String.trim方法。 第二,在比較之前,以與存儲搜索名稱相同的方式填充搜索名稱。 第三,您也許可以完全刪除填充(我不知道您的用例,但是String.format可能只允許您在輸出時填充)。
您的find
方法中有一個錯誤:
Employee find(String nm)
{
Iterator<Employee> it = empList.iterator();
while(it.hasNext())
{
Employee em = (Employee)it.next();
if(!em.name.equals(nm)) // should be if(em.name.equals(nm))
{
return em;
}
}
return null;
}
這將導致為以后的雇員調用setSales
時返回第一個雇員。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.