【问题标题】:How to make calculation inside class field in Java?如何在Java中的类字段内进行计算?
【发布时间】:2018-05-10 05:50:57
【问题描述】:

所以我创建了 Saving 类,还创建了 setter 和 getter。现在我需要 u 方法,它将计算存款总额。

public class Saving {

      private double deposits;

      private double totalAmountOfDeposits;

      public double getDeposits() 
             {                      
             return deposits;
             }

      public void setDeposits(double deposits) 
             { 
             this.deposits = deposits + deposits;
             }

      public double getTotalAmountOfDeposits()
             {
             double total = 0;
             return total = total + deposits;
             }
}

当我在程序中使用这个类时,我得到了一个错误的计算。该程序只是将存款的第一个值添加到第一个值。

import java.util.Scanner;

public class SavingDemo {

    public static void main(String[] args) {

        Scanner input = new Scanner(System.in);

        Saving save = new Saving();

        System.out.println("Deposit amount");
        double depositeAmount = input.nextDouble();
        save.setDeposits(depositeAmount);
        System.out.println("Deposit amount");
        double depositeAmount2 = input.nextDouble();
        save.setDeposits(depositeAmount);
        System.out.println("Deposit amount");
        double depositeAmount3 = input.nextDouble();
        save.setDeposits(depositeAmount);
        System.out.println("The total amount has been deposited is " + save.getTotalAmountOfDeposits());
    }
}

这是输出:

Deposit amount
12
Deposit amount
34
Deposit amount
56
The total amount has been deposited is 24.0

正如您所见,它只是将 12 增加到 12。只想提一下,我是编程新手。不到一个月。

【问题讨论】:

    标签: java class methods return return-value


    【解决方案1】:

    为了消除 Saving 类中的混淆,将 setDeposits() 方法的参数名称更改为 double newDeposit 而不是 double存款,这也是一个类字段名称。尽管该构造是合法的,但它确实使它有点混乱。在 setDeposits() 方法中使用:

    this.deposit+= newDeposit;
    

    事实上,您可以完全去掉 deposits 字段,因为您还有名为 totalAmountOfDeposits 的字段。改用它:

    this.totalAmountOfDeposits+= newDeposit;
    

    您可能还希望在 Saving 类中使用 clearDeposits() 方法:

    public void clearDeposits() {
        this.totalAmountOfDeposits = 0.0;
    }
    

    Saving 类中的 getTotalAmountOfDeposits() 方法也没有任何意义。由于您总是对存款求和,您只需返回 totalAmountOfDeposits 字段中的内容:

    public double getTotalAmountOfDeposits() {
        return totalAmountOfDeposits;
    }
    

    上述方法现在当然与 getDeposits() 方法非常相似,可以更改为 getTotalDeposits()。然后,您可以将 getTotalAmountOfDeposits() 方法名称更改为 getTotalNumberOfDeposits() 并添加一个名为 numberOfDeposits 的附加类字段:

    private double totalAmountOfDeposits;
    private int numberOfDeposits = 0;
    
    public double getTotalDeposits() {                      
         return totalAmountOfDeposits;
    }
    
    public int getTotalNumberOfDeposits() {
        return numberOfDeposits;
    }
    

    并在您的 setDeposits() 方法中添加代码行:

    numberOfDeposits++;
    

    所以它看起来像:

    public void setDeposits(double newDeposit) {
        totalAmountOfDeposits+= newDeposit;
        numberOfDeposits++;
    }
    

    如果您确实将 clearDeposits() 方法添加到您的 Saving 类,那么不要忘记将代码行:numberOfDeposits = 0; 也添加到该方法中。它现在可能看起来像:

    public void clearDeposits() {
        totalAmountOfDeposits = 0.0;
        numberOfDeposits = 0;
    }
    

    SavingDemo 类的 ma​​in() 方法中也存在一些问题。仔细查看您对用户提供的每个值的 setDeposits() 方法的每次调用。每个用户提供的值都进入一个特定的双精度类型变量名。这是您传递给 setDeposits() 方法的内容吗? ;)

    处理完所有内容后,您可以在控制台上显示:

    System.out.println("The total amount has been deposited is " + 
                save.getTotalDeposits() + " by making " + 
                save.getTotalNumberOfDeposits() + " deposits.");
    

    【讨论】:

      【解决方案2】:

      我在您的代码中发现了两个问题。看一下注释行。您看到 12 + 12 的原因是因为这正是您指示 JVM 执行的操作。

      System.out.println("Deposit amount");
      double depositeAmount = input.nextDouble();
      save.setDeposits(depositeAmount);
      System.out.println("Deposit amount");
      double depositeAmount2 = input.nextDouble();
      save.setDeposits(depositeAmount); // <= adds the wrong variable
      System.out.println("Deposit amount");
      double depositeAmount3 = input.nextDouble();
      save.setDeposits(depositeAmount); // <= adds the wrong variable
      System.out.println("The total amount has been deposited is " + save.getTotalAmountOfDeposits());
      

      其次,看起来您的 Saving 类的实现可能存在设计缺陷。

      您需要复习一下可变范围

      如果你看一下你的实施情况:

      public double getTotalAmountOfDeposits()
               {
               double total = 0;
               return total = total + deposits;
               }
      

      每次调用此方法 getTotalAmountOfDeposits() 时,您的总数都从 0 开始。此方法中的 total 变量是其方法的本地变量。所以你目前拥有的是一个方法变量

      您需要对类变量进行一些研究。这将保持对象的实例将在实例化对象的生命周期中分配此变量。

      当有同名变量时,可以通过this关键字获取实例变量。

      所以在与你的二传手打交道时

       public void setSomething(double something) {
           this.something // class variable
           something // method variable
       }
      

      如果您希望您的对象保持状态,您可以在您的对象本身上设置它,并让您的设置存款修改该状态。一些伪代码让你继续前进。

      public class Saving {
          private double totalAmountOfDeposits; // you can modify this value with public methods
      
          public void setDeposit(_) {
              // Setter implementation
              // increment totalAmountOfDeposits;
      
          public double getTotalAmountOfDeposits(_)
              // return totalAmountOfDeposits;
      }
      

      【讨论】:

        【解决方案3】:

        你应该写一个方法

        public void addDeposits(double deposits) 
                     { 
                     this.deposits = this.deposits + deposits;
                     }
        

        并将 setDeposits 更改为

        public void setDeposits(double deposits) 
                     { 
                     this.deposits = deposits;
                     }
        

        在调用 addDeposits 后添加存款

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-04-20
          • 2018-06-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-10
          • 1970-01-01
          相关资源
          最近更新 更多