Klassenmethoden

KlausWovo

Mitglied
Hi Leute,

ich habe es ja vor ein paar Tagen bereits probiert etwas vorzuarbeiten aber das stellte sich als ein Fehler heraus. Mittlerweile bin ich etwas "weiter" und mache mich jetzt an die Aufgabe, die ich probiert habe zu lösen.

Erstmal: Ist der Anfang, so wie ich ihn gemacht habe, richtig?

Also zuerst habe ich wie "verlangt" name, description und price deklariert. Danach habe ich probiert die id und nextID auch hinzubekommen. Da bin ich mir aber etwas unsicher. Auch, weil er mir da etwas falsches anzeigt. Er sagt mir: das nextID nicht deklariert werden kann in einem non-static-typ. Aber wie kann ich es sonst machen?

Danach habe ich getter-setter-Methoden (über Eclipse) erstellen lassen für alle Instanzvariablen.

Dann habe ich probiert eine neue Klassenmethode zu erstellen "createProductFrom()" und bin mir jetzt aber nicht ganz sicher... ich soll die übergebenen Parameter ja in p speichern... praktisch eine andere Klasse.

a) muss ich hier mit "this" arbeiten? Aber das würde ja nicht gehen, weil es ja heißt, dass und b) wie kann ich es denn im bereits vorhandenen Objekt p speichern?

Bis hierhin erstmal meine Frage :D

Java:
 class Product {


    //Instanzvariablen
    private String name;
    private String description;
    private double price ;

 

    public class Employee{
     
        int employeeID = nextID++;
        static int nextID = 0;
     
       
       
        }



    public String getName() {
        return name;
    }



    public void setName(String name) {
        this.name = name;
    }



    public String getDescription() {
        return description;
    }



    public void setDescription(String description) {
        this.description = description;
    }



    public double getPrice() {
        return price;
    }



    public void setPrice(double price) {
        this.price = price;
    }
     
 
public int createProductFrom(String name, String description, double price,  int employeeID, int nextID) {
 
 
    return p;
}

}
 

Anhänge

  • Lalilu.jpg
    Lalilu.jpg
    226 KB · Aufrufe: 72

mrBrown

Super-Moderator
Mitarbeiter
Warum gibts denn in Product eine Klasse Employee? ;)


Die Klassenmethode createProductFrom sollte static sein ;)
Was ist denn das schon existierende Objekt "p"?
 

KlausWovo

Mitglied
Hey, danke für deine Antwort. :D

Ja das mit "ohne static" ist mir gestern Abend auch noch aufgefallen, da man Klassenmethoden ja mit static kennzeichnet :D

Das mit Employee habe ich von meiner Vorlesungsfolie entnommen... Und dort wurde es in eine extra Klasse geschrieben. Ich habe es jetzt mal ohne geschrieben:

Java:
public class Product {


    //Instanzvariablen
    private String name; 
    private String description; 
    private double price ; 
   
            int ProductID = nextID++;
            static int nextID = 0;

Wäre es so besser?


Bezüglich des "p"... Dies ist in einer anderen Klasse drin "ProductManager" und steht für "Product", nehme ich mal an.

Java:
public class ProductManager {

    public static final int LIST = 0;
    public static final int REGISTER = 1;
    public static final int ADJUST_STOCK = 2;
    public static final int EXIT = 3;

    /**
    * Provides a command line interface to interact with the product management system for an online shop
    * @param args
    */
    public static void main(String[] args) {
        Warehouse warehouse = new Warehouse();
        warehouse.registerProducts(Warehouse.preloadInitialDataSet());
        System.out.println("Welcome to the online shop product management");
        boolean running = true;
        while (running) {
            System.out.println("Please, enter one of the following commands:"
                    + "\n0 to list all products"
                    + "\n1 to register a new product"
                    + "\n2 to adjust stock levels" + "\n3 to exit.");
            int command = IOTools.readInt();
           
           
            switch (command) {
                case LIST :
                    warehouse.printInventory();
                    break;
                case REGISTER :
                    Product p = Product.createProductFromUserinput();
                    warehouse.registerProducts(p);
                    System.out.println("The following product has been added to the catalog:\n"
                                    + p.toString());
                    break;
                case ADJUST_STOCK :
                    int id = IOTools.readInt("Please, enter product id:");
                    int stock = IOTools.readInt("Please, enter new stock level:");
                    warehouse.setStockForProductById(id, stock);
                    break;
                case EXIT :
                    running = false;
                    break;
                default :
                    System.out.println("Unknown command: " + command);
                    break;
            }
        }
        System.out.println("Byebye!");
    }

}


Dort ist halt "Product p = Product.createProductFromUserInput()" deklariert. Aber ich weiß nicht, wie ich die Parameter von der einen Klasse in P speichern kann? Muss ich das irgendwie über Arrays machen?
 

Javinner

Top Contributor
Java:
Product p = Product.createProductFromUserinput();
warehouse.registerProducts(p);

//Alt
public int createProductFrom(String name, String description, double price,  int employeeID, int nextID) {
    return p;
}
//Neu
public static Produkt createProductFromUserinput() {
    Scanner scanner = new Scanner(System.in);
    System.out.println("Geben Sie den Produktnamen ein");
    String name = scanner.nextLine();
    ...

    Produkt p = new Produkt(name, description, price, employeedID, nextID);
    return p;
}
Merke! Wenn du Wert geliefert bekommen möchtest, sollte die Methode vom Wert sein.
Java:
int i = liefereInt();
int liefereInt()
{
    return int;
}
Produkt p = liefereProdukt();
Produkt liefereProdukt()
{
    return Produkt;
}
 
Zuletzt bearbeitet:

truesoul

Top Contributor
Java:
Product p = Product.createProductFromUserinput();
warehouse.registerProducts(p);

//Alt
public int createProductFrom(String name, String description, double price,  int employeeID, int nextID) {
    return p;
}
//Neu
public static Produkt createProductFromUserinput() {
    Scanner scanner = new Scanner(System.in);
    System.out.println("Geben Sie den Produktnamen ein");
    String name = scanner.nextLine();
    ...

    Produkt p = new Produkt(name, description, price, employeedID, nextID);
    return p;
}
Schade dass du ihm die Lösung fast vorgibst. :(
 

KlausWovo

Mitglied
@truesoul

Ja, das Prinzip habe ich verstanden was genau er möchte. Ich soll ja praktisch die neuen Parameter also name etc in das "neue" Objekt "p" speichern.

Ja keine Sorge, ich orientiere mich nicht an Lösungen ich will es ja verstehen :D

@Javinner

Oh die "Scanner" Methode hatte ich leider noch nicht.

Das mit

Java:
public int createProductFrom([[URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+url']URL[/URL]='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+string'][URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+string']String[/URL][/[URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+url']URL[/URL]] name, [[URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+url']URL[/URL]='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+string'][URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+string']String[/URL][/[URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+url']URL[/URL]] description, double price,  int employeeID, int nextID) {
    return p;

Hatte ich 1 zu 1 so probiert aber dann erkennt er "p" nicht.
 

KlausWovo

Mitglied
Aber wieso denn das? Ich hatte doch in der anderen Klasse bereits ein Objekt p:

Java:
Product p = Product.createProductFromUserinput();

oder nicht? Das p ist doch damit dann automatisch deklariert also müsste er doch bei "return p" es auch erkennen und dort reinpacken, oder nicht?
 

Javinner

Top Contributor
KlausWovo hat gesagt.:
Oh die "Scanner" Methode hatte ich leider noch nicht
Du hast höchstwahrscheinlich das Buch Grundkurs Programmieren in Java
erworben. Wenn das der Fall ist: ich lege dir ans Herz dich gleich mit Java-Bibliothek auseinander zu setzen,
und auf ProgTools zu verzichten. Am Anfang schwer, aber machbar. Du wirst dir selbst danken ;)
Schade dass du ihm die Lösung fast vorgibst. :(
Von einer Lösung ist er weit entfernt ;) und siehe da:
KlausWovo hat gesagt.:
Hatte ich 1 zu 1 so probiert aber dann erkennt er "p" nicht.
 

KlausWovo

Mitglied
@Javinner

Ja, dass habe ich auch. :D Na ich arbeite eigentlich nur mit dem, was ich in den Vorlesungen/Tutorien/Übungen lerne. Dort haben wir Scanner noch nicht durchgenommen und nur mit ProgTools gearbeitet ^^

Ja, ich bin von einer Lösung wirklich weit entfernt. :D

Ich denke mir halt so: "Erstelle eine neue Klassemethode "createProductFrom" -> pack die Parameter dort rein und gebe es mit "return p" in p, da es ja schon deklariert wurde in der anderen Klasse ^^

@truesoul

Ahhh, ich dachte immer wenn es im selben Package wäre, dann würde er diese auch automatisch selber erkennen. Ah okay, dann verstehe ich was ihr meint. Also muss ich praktisch in der Klassenmethode ihm die andere Klasse "übergeben" bzw sagen, dass diese existiert ^^


Dann ist das mit "return p" ja gar nicht so falsch und ich mache dies mit "toString" oder?
 

truesoul

Top Contributor
Du musst in Product in der statischen Methode ein Product erzeugen und als Rückgabewert zurück geben. Die andere Klasse ruft die Methode auf und Speichert diese in eine Variable vom Typ Product.
 

Javinner

Top Contributor
KlausWovo hat gesagt.:
Ich denke mir halt so..
Das ist das Gute: du musst nicht denken, für dich haben schon viele Menschen gedacht und getan.
Was du musst: einfach nur die Anleitung zu dem, was funktioniert, lesen und nachvollziehen ;)

Ich würde das schöne Buch jetzt von der Seite 187 langsam und gründlich lesen, der Autor erklärt es wirklich gut,
und dann das gelesene auf das Beispiel übertragen.
 

KlausWovo

Mitglied
@truesoul

Entschuldige, dass ich es so dumm sage, aber wäre die Lösung dafür dann nicht einfach:

Java:
    public static int createProductFrom(String name, String description, double price,  int ProductID, int nextID) {
 
        Product p = new Product();
     
        return Product;

In der statischen Methode ein Product erzeugt und mit Rückgabewert zurückgegeben. Jetzt habe ich ein Product P aber noch ohne Werte oder? ^^

@Javinner ich werde es mir mal ganz gründlich durchlesen, auch wenn mir das Buch bis jetzt nicht so geholfen hat, weil es mir immer an Vorstellung mangelt ^^


////////////////////////////////////////////////////////////////////////////////////

Ich habe mich jetzt auch "nebenbei" an "createProductFromUserinput" herangewagt.

Dort wollte ich mit IOTools halt eine Eingabe machen und diese sollte er dann im neuen "Product" speichern. Hier so wollte ich es machen:

Java:
public static Product createProductFromUserinput() {
   
   
    String name = IOTools.readString("Bitte geben Sie einen Produktnamen ein: ");
    String description = IOTools.readString("Bitte geben Sie eine Beschreibung ein: ");
    double price = IOTools.readDouble("Bitte geben Sie einen Preis ein:  ");
    int ProductID = IOTools.readInt("Bitte eine ID eingeben: "); 
    int nextID; 
   
   
    Product p = new Product(name, description, price, ProductID, nextID); 
    return p;
}
   

}

Leider sagt er mir dann in der Zeile Prodct p "The constructor Product(String, String, double, int) is undefined. :/
 
Zuletzt bearbeitet:

truesoul

Top Contributor
Das würde ich gerne von dir wissen anhand deines letzten Beispiels.

Was ist eine Variable?
Was ist eine Variablendeklaration?
Was ist ein Datentyp?

Wenn du weißt was die 3 Punkte sind kannst du auch die Methode richtig schreiben.
 

KlausWovo

Mitglied
@truesoul

Na eine Variable ist halt ein gewisser Wert. Praktisch wie "a = 3". Dann wäre meine Variable "a" mit dem Wert "3" versehen ^^

Deklaration ist, wenn ich der Variable einen Wert zuweise und Datentypen sind halt String, int, long, float etc.

ABer meine Variablen sollten doch "name" etc sein
 

KlausWovo

Mitglied
Achso.

Na Variablen wäre dann doch "name, description, price, ProductID, nextID) und die Datentypen wären String, double,int und deklarieren tue ich es doch mit : "String name" Also sage ich ihm doch -> die Variable "name" wird vom Datentyp "String"
 

KlausWovo

Mitglied
Ich wünschte du wärst mein Tutor, dann würde ich mehr verstehen und lernen :D

Na im Methodenbody habe ich ein IOTools eingeführt mit den passenden Datentypen... halt für Name, dass er auch ein "String" eingegeben bekommt und keine Zahl.

Das müsste dann doch also eigentlich funktionieren. Ich hab Algorithmen geschrieben, die habe ich genauso mit "int m = IOTools.readInt..." geschrieben.
 

KlausWovo

Mitglied
@truesoul
Also müsste ich beispielsweise es so schreiben?

Java:
public class Konstruktor (String name, String description, double price,  int ProductID, int nextID) {

Product.name = name
Product.description = description
Product.price = price
Product.ProductID = ProductID
Product.nextID = nextID
}

Sowas in der Art?
 

temi

Top Contributor
@truesoul
Also müsste ich beispielsweise es so schreiben?

Sowas in der Art?

Der Konstruktor einer Klasse heißt so wie die Klasse selbst, z.B.
Java:
public class Foo
{
  public Foo(int someInt) // Konstruktor mit einem int-Parameter
  {
    // Code
  }
}

public class Bar
{
  public Bar(String someString, int someInt) // mehr Parameter
  {
    // Code
  }
  public Bar(String someString) // es können auch mehrere Konstruktoren definiert werden, wenn deren Signatur (Parameter) unterschiedlich ist
  {
    // Code
  }
}

public class FooBar
{
  public FooBar() // Konstruktor ohne Parameter
  {
    // Code
  }
  // weiterer Code
}
}

Der parameterlose Konstruktor aus dem dritten Beispiel (FooBar) nennt sich auch Standardkonstruktor. Sofern du keinen eigenen Konstruktor für eine Klasse erstellt hast, wird der Standardkonstruktor automatisch erzeugt. Das bedeutet, dass das dritte Beispiel könnte auch so aussehen:
Java:
public class FooBar
{
  // kein Konstruktor definiert, damit wird der Standardkonstruktor automatisch erzeugt
  // weiterer Code
}
 
Zuletzt bearbeitet:

Ähnliche Java Themen


Oben