2016-04-27 46 views
-1

我已经看过关于此主题的其他答案,但没有找到任何帮助。下面是我有类:非静态方法不能从静态上下文中引用,但什么都不是静态的

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()不能从静态上下文中引用”这些方法都不是静态的,因为在这个时间点上,我们有没有必要为他们。我在这里错过了什么?

+5

您的意思是'product.getID()',带有_lowercase_'''吗? – rgettman

+2

欢迎来到Stack Overflow。请始终尝试将问题减少到[mcve] - 这里包含了超过250行的代码,用于可能在大约15次显示的内容。 –

+0

哦,我的上帝..我一直在试图解决这个问题像现在三天。非常感谢! – Blaza

回答

0

您在致电Product.getID()。 Product是类名称,您可以以这种方式调用的唯一方法是静态类方法。 在你的情况下,getID()不是一个静态方法,因此应该由该类的一个实例调用。产品不是Product的实例,参照对象本身,p应该是小写的。

0

替换:

if(Product.getID() == item) 

有:

if(product.getID() == item) 

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

0

getID方法是一种实例方法。这意味着你将不得不为它创建一个对象,以便使用它并访问这个类的数据字段,以便它可以返回创建的OBJECT的ID。

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

相关问题