这是一个简单的Java应用程序,它通过汇总部门所有员工的月工资来计算部门的每月支出。部门的工作人员按层次结构排列:(测试人员支付了500.0__,&,开发人员支付了1000.0__,在经理支付了300.0__,在经理支付了300.0__)。
这样,ManagerA的总费用应该是2100.0。这个总费用是部门每月的开支。
我打算构建一个应用程序来实现这一点&然后通过测试getTotalExpenses(),的返回(应该是2100.0 )来证明这一点。
我构建了测试,测试失败(图片):
因此,我使用大量的println()构建了一个main(),以查看发生了什么&得到了一些非常意外的输出(图片):
monDepExpensesApp.QATester@15db9742
monDepExpensesApp.Developer@6d06d69c
monDepExpensesApp.Manager@7852e922
monDepExpensesApp.Manager@7852e922
monDepExpensesApp.Manager@4e25154f
monDepExpensesApp.Manager@4e25154f
所有文档中的源代码都在下面,它解释了很多。
但以下是我的问题:
我从来没有见过这样的Java。
注意:我构建主程序只是为了告诉我为什么我的测试失败了。注:第二个问题已获答覆。
谢谢你看一看,我很有兴趣看看你有什么发现。
雇员
package monDepExpensesApp;
/**
* Employee declares expenses, & getExpenses().
*
* Employee is the superclass of Manager, QATester, and Developer.
*
* @author Reed
*/
public class Employee {
protected double expenses;
/**
* getExpenses() returns the monthly allocation amount of a Manager, Developer, or QATester object.
* @return a double values representing what the specified Employee is paid each month.
*/
public double getExpenses() {
return expenses;
}
}
Developer
package monDepExpensesApp;
/**
* Developers warrant a monthly allocation of $1000.00, per Developer.
*
* Developer extends Employee.
*
* @author Reed
*/
public class Developer extends Employee {
/**
* Developer() creates a Developer, who is paid $1000.0 a month.
*/
public Developer() {
expenses = 1000.0;
}
}
QATester
package monDepExpensesApp;
/**
* QA Testers warrant a monthly allocation of $500.00, per QA Tester.
*
* QATester extends Employee.
*
* @author Reed
*/
public class QATester extends Employee {
/**
* QATester() creates a QA Tester, who is paid $500.0 a month.
*/
public QATester() {
expenses = 500.0;
}
}
管理器
package monDepExpensesApp;
import java.util.ArrayList;
/**
* Managers warrant a monthly allocation of $300.00, per Manager.
*
* A manager is at the top of a hierarchical relationship,
* in which one manager oversees employees such as developers,
* QA testers, & other managers. A hierarchy is constituted of all the
* employees of a department. An employee's title is associated with
* an amount paid monthly. A departments monthly expenses can be determined
* by adding the amounts paid to the employees in a hierarchy.
*
* Manager extends Employee.
*
* @author Reed
*/
public class Manager extends Employee {
private ArrayList<Employee> employeeList = new ArrayList<>();
/**
* Manager() creates a Manager, who is paid $300.0 a month.
*/
public Manager() {
expenses = 300.0;
}
/**
* Add() adds employees to a list.
* @param employee
*/
public void add(Employee employee) {
employeeList.add(employee);
}
/**
* getTotalExpenses() adds the values in employeeList,
* calculating a departments total monthly expenses.
* @return the value of totalExpenses.
*/
public double getTotalExpenses() {
double totalExpenses = 0.00;
for(Employee employee : employeeList) {
totalExpenses += employee.getExpenses();
}
return totalExpenses;
}
}
DepOneExpTest
package monDepExpensesApp.UnitTest;
import static org.junit.Assert.*;
import monDepExpensesApp.Developer;
import monDepExpensesApp.Manager;
import monDepExpensesApp.QATester;
import org.junit.Test;
/**
* DepOneExpTest evaluates a departments actual total expenses,
* by comparing them to a projected total.
*
* @author Reed
*/
public class DepOneExpTest {
/**
* testOne() compares a departments actual total expenses with a projected total of $2100.00.
* This departments employees create the following hierarchy:
* managerA <-- managerB <-- tester1 & dev1.
*/
@Test
public void test() {
QATester tester1 = new QATester();
Developer dev1 = new Developer();
Manager managerB = new Manager();
managerB.add(tester1);
managerB.add(dev1);
Manager managerA = new Manager();
managerA.add(managerB);
assertEquals(2100.0, managerA.getTotalExpenses(), 0.001);
}
}
Main2
package monDepExpensesApp;
public class Main2 {
public static void main(String[] args) {
QATester tester1 = new QATester();
System.out.println(tester1);
Developer dev1 = new Developer();
System.out.println(dev1);
Manager managerB = new Manager();
System.out.println(managerB);
managerB.add(tester1);
managerB.add(dev1);
System.out.println(managerB);
Manager managerA = new Manager();
System.out.println(managerA);
managerA.add(managerB);
System.out.println(managerA);
}
}
发布于 2015-02-25 07:20:59
当您打印一个对象时,它只是打印调用toString()
的结果。默认的toString()
实现将返回一个包含类名和哈希代码表示的字符串(参见toString()
Javadoc )。正如其他人所指出的,您可以通过重写toString()
来改进事情。
@Override
public String toString() {
return expenses + " " + employeeList;
}
你的问题是:
totalExpenses += employee.getExpenses();
这会增加子女的开支,但不会增加孙辈的开支。你想:
totalExpenses += employee.getTotalExpenses();
您还可能希望getTotalExpenses()
依赖于expenses
字段。
发布于 2015-02-25 05:10:20
只需将以下内容添加到Employee类中,就可以解决问题
@Override
public String toString() {
//return something sensible like the Employee Name
return getEmployeeName();
}
https://stackoverflow.com/questions/28711455
复制相似问题