非静态方法不能从静态上下文引用,但没有任何内容是静态的

时间:2016-04-27 20:21:04

标签: java

我已经看过关于这个主题的其他答案,但没有找到任何帮助。这是我的课程:

import java.util.ArrayList;

/**
* Manage the stock in a business.
* The stock is described by zero or more Products.
* 
* @author  
* @version
*/
public class StockManager
{
// A list of the products.
private ArrayList<Product> stock;

/**
 * Initialise the stock manager.
 */
public StockManager()
{
    stock = new ArrayList<Product>();
}

/**
 * Add a product to the list.
 * @param item The item to be added.
 */

public void addProduct(Product item)
{

    for(Product product: stock)
    {
        if(Product.getID() == item)
        {
            System.out.println("Please add an item with a different id");
        }

        else
        {
         stock.add(item);

        }
    }
}

/**
 * Receive a delivery of a particular product.
 * Increase the quantity of the product by the given amount.
 * @param id The ID of the product.
 * @param amount The amount to increase the quantity by.
 */

public void delivery(int id, int amount)
{
   for(Product product : stock)
   {
       if(findProduct(id) != null)
       {
            increaseQuantity(amount);

        }

   }
}

/**
 * Try to find a product in the stock with the given id.
 * @return The identified product, or null if there is none
 *         with a matching ID.
 */

public Product findProduct(int id)
{
    for(Product product : stock)
    {
       if( id == getID())
       {
         return getName();  
       }

       else
       {
           return null;
       }



    }
}

/**
 * Locate a product with the given ID, and return how
 * many of this item are in stock. If the ID does not
 * match any product, return zero.
 * @param id The ID of the product.
 * @return The quantity of the given product in stock.
 */
public int numberInStock(int id)
{
    for(Product product : stock)
    {
        if(id == getID())
        {
            getQuantity();
        }

        else
        {
            return 0;
        }
    }


}

/**
 * Print details of all the products.
 */
public void printProductDetails()
{
    for( Product product: stock)
    {
       toString();
    }
}


/**
 * This method prints the deatils
 * of products under a certain quantity
 * @param the amount you want to check under
 */
public void lowStockCheck(int amount)
{
    for(Product product : stock)
    {
        if( getQuantity() < amount)
        {
            printProductDetails();
        }
    }

}

/**
 * Find a product via it's name
 * rather than ID
 * @param Name of product
 */
public Product findProductName(String name)
{
    for(Product product : stock)
    {
        if(name.equals(getName()))
        {
            return getName();
        }
        else
        {
          return null;  
        }

    }
}

这是产品类:

/**
* Model some details of a product sold by a company.
* 
* @author David J. Barnes and Michael Kölling.
* @version 2011.07.31
*/
public class Product
{
  // An identifying number for this product.
  private int id;
  // The name of this product.
  private String name;
  // The quantity of this product in stock.
  private int quantity;

/**
 * Constructor for objects of class Product.
 * The initial stock quantity is zero.
 * @param id The product's identifying number.
 * @param name The product's name.
 */
public Product(int id, String name)
{
    this.id = id;
    this.name = name;
    quantity = 0;
}

/**
 * @return The product's id.
 */
public int getID()
{
    return id;
}

/**
 * @return The product's name.
 */
public String getName()
{
    return name;
}

/**
 * @return The quantity in stock.
 */
public int getQuantity()
{
    return quantity;
}

/**
 * @return The id, name and quantity in stock.
 */
public String toString()
{
    return id + ": " +
           name +
           " stock level: " + quantity;
}

/**
 * Restock with the given amount of this product.
 * The current quantity is incremented by the given amount.
 * @param amount The number of new items added to the stock.
 *               This must be greater than zero.
 */
public void increaseQuantity(int amount)
{
    if(amount > 0) {
        quantity += amount;
    }
    else {
        System.out.println("Attempt to restock " +
                           name +
                           " with a non-positive amount: " +
                           amount);
    }
}

/**
 * Sell one of these products.
 * An error is reported if there appears to be no stock.
 */
public void sellOne()
{
    if(quantity > 0) {
        quantity--;
    }
    else {
        System.out.println(
            "Attempt to sell an out of stock item: " + name);
    }
}

我得到的错误是在StockManager类的addProduct函数中。这段代码专门

/**
 * Add a product to the list.
 * @param item The item to be added.
 */

 public void addProduct(Product item)
{

    for(Product product: stock)
    {
        if(Product.getID() == item)
        {
            System.out.println("Please add an item with a different id");
        }

        else
        {
         stock.add(item);

        }
    }
}

错误说“非静态方法getID()不能从静态上下文引用”这两种方法都不是静态的,因为此时我们不需要它们。我在这里缺少什么?

3 个答案:

答案 0 :(得分:0)

您正在调用Product.getID()。 Product是类名,您可以以这种方式调用的唯一方法是静态类方法。 在您的情况下,getID()不是静态方法,因此应该由类的实例调用。 Product不是Product的实例,p在引用对象本身时应该是小写的。

答案 1 :(得分:0)

替换:

if(Product.getID() == item)

使用:

if(product.getID() == item)

Product(大写P)是类名,而product是实例名。

答案 2 :(得分:0)

getID方法是一个实例方法。这意味着您必须为它创建一个对象才能使用它并访问该类的数据字段,以便它可以返回创建的OBJECT的ID。

  

您实际上是通过调用类名来访问该方法,就像调用静态方法一样。但它不会被class.methodName();称为它   尝试直接调用它。