【问题标题】:Having Trouble Calling Method for Object - JAVA无法调用对象的方法 - JAVA
【发布时间】:2016-07-31 00:35:43
【问题描述】:

到目前为止,我已经设法使用一个名为 ExpenseItem 的类对费用进行建模。此类使用属性名称、金额和频率对费用进行建模。属性应建模为该类的私有成员。因此,我使用了一个接受这三个参数的构造函数。

我在类中实现以下方法时遇到问题:

年度总计;它应该返回 ExpenseItem 对象的估计总费用。它需要是数量 * 频率。

我在实现该方法时遇到了困难,因此我可以让它从 ExpenseItem 中获取所有金额和频率并将总数相加。到目前为止,我只有 3 个:

ExpenseItem e1 = new ExpenseItem ("Coffee", 2.25 , 6);
ExpenseItem e2 = new ExpenseItem ("Food", 5.30 , 5);
ExpenseItem e3 = new ExpenseItem ("Gas", 20.00 , 2);

如何实现一个方法,从 e1、e2、e3、e(n)... 中获取双精度值并乘以每个值的费用?例如,e1 年度总计 = 2.25 * 6。

当前代码如下:

public class ExpenseItem {

private String name;
public double amount;
public double frequency;
public double total;
public ExpenseItem(String name, double amount, double frequency) {
    this.name = name;
    setAmount(amount);
    setFrequency(frequency);

}
public double annualTotal(double amount, double frequency){
    double total= amount+frequency;
    return total;
    //System.out.printf("the total is:",total );
}

public void setName(String name){
    this.name = name;
}

public String getName(){
    return name;
}
public void setAmount(double amount){
    this.amount = amount>=0 ? amount:0 ;
}
public double getAmount(){
    return amount;
}
public void setFrequency(double frequency){
        this.frequency = frequency>=0 ? frequency:0 ;
}
public double getFrequency(){
        return frequency;
}

public static void main(String[] args) {
ExpenseItem e1 = new ExpenseItem ("Coffee", 2.25 , 6);
ExpenseItem e2 = new ExpenseItem ("Food", 5.30 , 5);
ExpenseItem e3 = new ExpenseItem ("Gas", 20.00 , 2);

System.out.println("Expense Item     Amount   Frequency\n");
  outputInfo(e1);outputInfo(e2);outputInfo(e3);  
 }

private static void outputInfo(ExpenseItem e){
System.out.printf("%-15s\t%5.2f\t%5.0f\n",
 e.getName(),e.getAmount(), e.getFrequency() );
    }

  }

【问题讨论】:

  • 你不会从 ONE ExpenseItem 中得到它 - 这不是一个非常有趣的平均值。您更有可能创建一个 ExpenseItems 列表并对其进行平均。
  • 是的,您需要创建某种持有者类——例如ExpenseAccount——来保存你所有的费用项目。然后创建一个方法来汇总 ExpenseAccount 上的 ExpenseItems。

标签: java object methods constructor


【解决方案1】:

ExpenseItem 类具有实例中每个计算所需的元素,因此无需定义此方法

public double annualTotal(double amount, double frequency){
    double total= amount+frequency;
    return total;
    //System.out.printf("the total is:",total );
}

这样做

public double annualTotal(){

    return (double)this.amount * this.frequency;

}

除此之外,我将定义一个静态累加器成员(因为该 vale 用于类而不是对象)

public class ExpenseItem {

private String name;
public double amount;
public double frequency;
public double total;

public static double totalAcumulator = 0;  //here is the trick
public ExpenseItem(String name, double amount, double frequency) {
    this.name = name;
    setAmount(amount);
    setFrequency(frequency);
    totalAcumulator += annualTotal(); // and you call it every time you construct an object.
}

你可以通过调用来获取它的值

ExpenseItem.totalAcumulator

【讨论】:

  • 啊,有道理。好吧,现在我无法在主函数上打印/显示它,因为它告诉我它不能对非静态方法进行静态引用,例如AnnualTotal()。我希望能够在我的代码末尾显示这个总数。有什么帮助吗?
【解决方案2】:

您正在使用加法 + 运算符而不是乘法 * 运算符

你的功能

public double annualTotal(double amount, double frequency){
double total= amount+frequency;
return total;
//System.out.printf("the total is:",total );

}

应该如下所示

public double annualTotal(double amount, double frequency){
double total= amount * frequency;
return total;
//System.out.printf("the total is:",total );

}

这有帮助吗?

【讨论】:

    【解决方案3】:

    对于这样的事情,我觉得使用不可变对象是有意义的。由于total 是派生字段:

    public class ExpenseItem {
    
        private final String name;
        private final double amount;
        private final double frequency;
        private final double total;
    
        public ExpenseItem(String name, double amount, double frequency) {
            this.name = name;
            this.amount = amount >= 0 ? amount : 0;
            this.frequency = frequency >= 0 ? frequency : 0;
            this.total = amount * frequency;
        }
    
        public String getName() {
            return name;
        }
    
        public double getAmount() {
            return amount;
        }
    
        public double getFrequency() {
            return frequency;
        }
    
        public double getTotal() {
            return total;
        }
    
        @Override
        public String toString() {
            return String.format("%-10s%-10.2f%-5.0f%1.2f", name, amount, frequency, total);
        }
    
        public static void main(String[] args) {
            ExpenseItem e1 = new ExpenseItem ("Coffee", 2.25 , 6);
            ExpenseItem e2 = new ExpenseItem ("Food", 5.30 , 5);
            ExpenseItem e3 = new ExpenseItem ("Gas", 20.00 , 2);
    
            System.out.println(e1);
            System.out.println(e2);
            System.out.println(e3);
    
            double total = e1.getTotal() + e2.getTotal() + e3.getTotal();       
            System.out.println(String.format("\n%-25s%1.2f", "Total", total));
        }
    }
    

    输出:

    Coffee    2.25      6    13.50
    Food      5.30      5    26.50
    Gas       20.00     2    40.00
    
    Total                    80.00
    

    您还可以在列表中包含ExpenseItems:

    public static void main(String[] args) {
        List<ExpenseItem> list = Arrays.asList(
                new ExpenseItem ("Coffee", 2.25 , 6),
                new ExpenseItem ("Food", 5.30 , 5),
                new ExpenseItem ("Gas", 20.00 , 2)
                );
    
        double total = 0;
        for(ExpenseItem e : list) {
            System.out.println(e);
            total += e.getTotal();
        }
    
        System.out.println(String.format("\n%-25s%1.2f", "Total", total));
    }
    

    产生相同的输出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-11
      • 2021-10-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多