2016-04-27 9 views
-1

Ich habe andere Antworten zu diesem Thema untersucht und habe nichts gefunden, um zu helfen. Hier sind die Klassen I haben:Nicht-statische Methode kann nicht aus statischen Kontext referenziert werden, aber nichts ist statisch

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; 
     } 

    } 
} 

Und hier ist die Produktklasse:

/** 
* 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); 
    } 
} 

Der Fehler, den ich erhalten, ist in der addProduct Funktion in der Klasse Bestandsverwalter. Dieses Stück Code speziell

/** 
* 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); 

     } 
    } 
} 

Der Fehler sagt „nicht-statische Methode getID() kann nicht von einem statischen Kontext verwiesen werden“ Keine dieser Methoden statisch ist, da zu diesem Zeitpunkt die wir für sie keine Notwendigkeit, . Was fehlt mir hier?

+5

Meinten Sie 'product.getID()', mit einem _lowercase_ 'p'? – rgettman

+2

Willkommen bei Stack Overflow. Bitte versuche immer, dein Problem auf ein [mcve] zu reduzieren - du hast über 250 Codezeilen hier eingefügt, für etwas, das in etwa 15 hätte gezeigt werden können. –

+0

Oh mein Gott .. Ich habe versucht, dies zu beheben wie jetzt drei Tage. Ich danke dir sehr! – Blaza

Antwort

0

Sie rufen Product.getID(). Produkt ist der Klassenname und die einzigen Methoden, die Sie auf diese Weise aufrufen können, sind statische Klassenmethoden. In Ihrem Fall ist getID() keine statische Methode und sollte daher von einer Instanz der Klasse aufgerufen werden. Das Produkt ist keine Instanz des Produkts, das p sollte kleingeschrieben sein und sich auf das Objekt selbst beziehen.

0

Replace:

if(Product.getID() == item) 

mit:

if(product.getID() == item) 

Product (mit Großbuchstaben P) ist die Klassennamen, während der Name product Instanz ist.

0

Die Methode getID ist eine Instanzmethode. Das bedeutet, dass Sie ein Objekt dafür erstellen müssen, um es zu verwenden und auf die Datenfelder dieser Klasse zuzugreifen, damit es die ID eines OBJEKTS, das erstellt wurde, zurückgeben kann.

Sie greifen tatsächlich auf die Methode zu, indem Sie den Klassennamen wie eine statische Methode aufrufen. Aber es wird nicht von class.methodName(); anrufen. Versuchen Sie es direkt anzurufen.

Verwandte Themen