This question already has answers here:
“Non-static method cannot be referenced from a static context” error

(4个答案)


1年前关闭。




好的!因此,我对Java还是很陌生,所以本周我们才开始学习实例和类。

我的问题是我的教授分配了一个程序(我已经花了大约10个小时,虽然取得了进展,但仍然有问题),但指令却含糊不清,我不确定如何将其合并进入我的程序。

这是一个购物车程序,其中包含产品的名称,描述,价格和数量。所有这些特性都进入了我没有遇到问题的Item2类,然后在toString()类中使用Item2方法进行打印。

接下来,我将其名称添加到ShoppingCart2类的一个数组中(addItems方法),然后制作将通过getTotalarrayItems方法,并加总每个项目的价格(应分别调用每个Item对象的calculateUnitTotal()方法和加起来)。

我的问题是,通过尝试调用calculateUnitTotal(),我得到了以下错误:



或取消引用错误。

我的教授不希望我从Item2类中调用单位和价格对象,我需要专门调用此方法。

我知道我需要创建一个实例来执行此操作,并且无法将对象转换为 double 对象,但是我尝试的所有操作似乎均不起作用。

我不确定自己在做什么错。我也知道代码有点乱,我尽力将其清理干净。任何意见,将不胜感激!

Item2.java:

        class Item2{
            private String productName;
            public class Item2{
            private String productName;
            private String productDesc;
            private double unitPrice;
            private int units;

            public String getProductName(){
                return productName;
            }
            public String getproductDesc(){
                return productDesc;
            }
            public double getUnitPrice(){
                return unitPrice;
            }
            public int getUnits(){
                return units;
            }
            public void setProductName(String newProductName){
                productName = newProductName;
            }
            public void setProductDesc(String newProductDesc){
                productDesc = newProductDesc;
            }
            public void setUnitPrice(double newUnitPrice){
                unitPrice = newUnitPrice;
            }
            public void setUnits(int newUnits){
                units = newUnits;
            }

        void Item2(){
            productName = "";
            productDesc = "";
            unitPrice = -1;
            units = -1;}

            public void Item2(String newProductName, String newProductDesc,
            double newUnitPrice, int newUnits) {
                productName = newProductName;
                productDesc = newProductDesc;
                unitPrice = newUnitPrice;
                units = newUnits;
                }

           public double calculateUnitTotal(){
                double total = unitPrice * units;
                return total;
                }

          public String toStrings() {
               NumberFormat fmt = NumberFormat.getCurrencyInstance();
               return (productName + "\t" + fmt.format(unitPrice) + "\t" +
               units + "\t" + fmt.format(unitPrice * units));
          }
       }

ShoppingCart2.java:
       class ShoppingCart2{
          private String[] arrayItems;
          private int numItems;

          public ShoppingCart2(){
              arrayItems = new String[20];
              numItems = 0;

          }
          public void addItems(String itemName){
              for(int i = 0; i < numItems; i++){
                  if(numItems==arrayItems.length)
                     System.out.println("Cart is full.");
                  else{
                     arrayItems[numItems]= itemName;
                     numItems++;
                      }
                    }
                 }
         public ShoppingCart2 getTotal(){
              ShoppingCart2 total = new ShoppingCart2();

              for(int i = 0; i < numItems; i++){
               /////I've tried several different methods here, they always
                 ////lead to either
                 /// a need to dereference or the non static method error
               }
              return total;}

        public String toString() {
             NumberFormat fmt = NumberFormat.getCurrencyInstance();

             String cart = "\nShopping Cart\n";

             for (int i = 0; i < numItems; i++)
                  cart += arrayItems[i] + "\n";

                  cart += "\nTotal Price: " + fmt.format(total);
                  cart += "\n";

                  return cart;
             }
           }


我希望输出是数组中各项的名称以及所有项的总数。

最佳答案

在我看来,这种想法是使用Item2类封装所有属性,然后使用ShoppingCart2管理您对它们的处理。

因此,您的ShoppingCart2可能必须看起来像:

class ShoppingCart{
  private ArrayList<Item2> items;

  public ShoppingCart2(){
    items = new ArrayList<Item2>();
  }

  public void addItem(Item2 item){
    items.add(item);
  }

  public void addItems(ArrayList<Items> items){
    this.items.addAll(items)
  }

  public double getTotal(){
    double total = 0L;
    for(Item2 item : items){
      total += item.calculateUnitTotal();
    }
    return total;
  }

  public String toString(){
     StringBuffer sb = new StringBuffer();
     for (Item2 item: items){
       // Print each item here
       sb.append(item.toString());
       sb.append("----------------\n");
     }
     sb.append("*************");
     sb.append("Total Price: ");
     sb.append(getTotal());
     return sb.toString();
  }
}

注意:此代码尚未经过全面测试。

*更新*

仔细研究表明您的Item2类是错误的。
这是一个更清洁的版本。
class Item2 {
    private String productName;
    private String productDesc;
    private double unitPrice;
    private int units;

    public Item2(){
        productName = "";
        productDesc = "";
        unitPrice = -1;
        units = -1;
    }

    public Item2(String newProductName,
                String newProductDesc,
                double newUnitPrice,
                int newUnits) {
        productName = newProductName;
        productDesc = newProductDesc;
        unitPrice = newUnitPrice;
        units = newUnits;
    }

    public String getProductName(){
        return productName;
    }
    public String getproductDesc(){
        return productDesc;
    }
    public double getUnitPrice(){
        return unitPrice;
    }
    public int getUnits(){
        return units;
    }
    public void setProductName(String newProductName){
        productName = newProductName;
    }
    public void setProductDesc(String newProductDesc){
        productDesc = newProductDesc;
    }
    public void setUnitPrice(double newUnitPrice){
        unitPrice = newUnitPrice;
    }
    public void setUnits(int newUnits){
        units = newUnits;
    }

    public double calculateUnitTotal(){
        return unitPrice * (double) units;
    }

    public String toString() {
       NumberFormat fmt = NumberFormat.getCurrencyInstance();
       StringJoiner sj = new StringJoiner("\t");
       sj.add(productName).add(unitPrice).add(units).add(fmt.format(unitPrice * units));
       return sj.toString();
    }
}

一些解释

您希望在连接字符串时使用StringJoiner或StringBuffer的原因是,它比使用加号+运算符更有效。

加号运算符会产生很多开销,因为它需要两个参数字符串,并从中创建一个全新的字符串。

StringBuffer和StringJoiner允许您添加字符串,最后一刻,您可以将它们全部组合为一个字符串。

关于java - 如何正确调用Item2.calculateUnitTotal(),以便可以将金额添加到总变量中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55799797/

10-10 16:36