2017-05-20 2 views
0

Ich versuche zufällige Lebensmittel und Waschmittel Objekte zu generieren und sie zu einem Produkt Arraylist hinzuzufügen, (Essen und Waschmittel Klassen erweitern Produkte), aber wenn ich versuche, aus dem Arraylist alle zufälligen Eigenschaften zu lesen bin ich 0 oder null. Ich kann Ihnen bei Bedarf den Code für die anderen Klassen zur Verfügung stellen, aber ich glaube nicht, dass es ein Problem mit den Konstruktoren gibt. Danke im Voraus.Object arraylist Fehler

ArrayList<Products> products = new ArrayList<>(); 
    for (int i = 0; i <= 300; i++) { 
     char[] chars = "abcdefghijklmnopqrstuvwxyz".toCharArray(); 
     StringBuilder sb = new StringBuilder(); 
     Random random = new Random(); 
     for (int a = 0; a < 10; a++) { 
      char c = chars[random.nextInt(chars.length)]; 
      sb.append(c); 
     } 
     String a = sb.toString(); 

     Random generator = new Random(); 
     int randomIndex = generator.nextInt(manufacturers.length); 
     String b = manufacturers[randomIndex]; 

     int randomIndex2 = generator.nextInt(suppliers.length); 
     String c = suppliers[randomIndex2]; 

     Random r = new Random(); 
     int d = ThreadLocalRandom.current().nextInt(7, 28 + 1); 
     int e = ThreadLocalRandom.current().nextInt(12, 31 + 1); 
     int f = ThreadLocalRandom.current().nextInt(-1, 30 + 1); 
     int g = ThreadLocalRandom.current().nextInt(-8, 25 + 1); 

     products.add(new Food(a, b, c, d, e, f, g)); 

hier ist das Essen Konstruktor:

Food(String name,String manufacturer,String supplier,int purchase_price,int selling_price,int sale_date,int expiration_date){ super(name,manufacturer,supplier,purchase_price,selling_price,sale_date); expiration_date=this.expiration_date; }

und die übergeordnete Klasse Code Produkte:

Products(String name,String manufacturer,String supplier,int purchase_price,int selling_price,int sale_date){ 
    name=this.name; 
    manufacturer=this.manufacturer; 
    supplier=this.supplier; 
    purchase_price=this.purchase_price; 
    selling_price=this.selling_price; 
    sale_date=this.sale_date;}` 
+2

Können Sie versuchen, das Problem in einem kleineren Codeabschnitt zu isolieren? – synchronizer

+0

Nur den Code bearbeitet. Die bearbeitete Frage enthält nur den Teil für die Objekte der Lebensmittelklasse. Ich benutze später den gleichen Code, um Objekte aus der Waschmittelklasse zu den Produkten hinzuzufügen. – Far

+0

Lesen Sie den Code, warum erstellen Sie 3 Instanzen von 'Random'? Sie müssen nicht jedes Mal ein neues erstellen, wenn Sie es benötigen, es einmal erstellen und im gesamten Code verwenden. Jetzt werde ich versuchen zu sehen, warum Ihre 'products.add' nicht funktioniert. Da ist das Problem, oder? – steven

Antwort

0

Das Problem im Products Konstruktor zu sein scheint:

Products(String name,String manufacturer,String supplier,int purchase_price,int selling_price,int sale_date) { 
    name=this.name; 
    manufacturer=this.manufacturer; 
    supplier=this.supplier; 
    purchase_price=this.purchase_price; 
    selling_price=this.selling_price; 
    sale_date=this.sale_date; 
} 

Die linke Seite der obigen Konstruktoranweisungen sollte den Zeiger this dem Argument zuweisen, das an die Liste der Konstruktorparameter übergeben wurde, nicht umgekehrt. Ihr Konstruktor legt die Argumente der lokalen Parameterliste auf this .Eigene Eigenschaft ist, bevor Eigenschaften festgelegt wurden (null oder 0). Mit anderen Worten, Ihr Konstruktor ist ein No-Op, da die Konstruktorargumente temporäre sind, die verschwinden, nachdem wir den Konstruktorbereich verlassen haben.

Was Sie tun gemeint: sind

Products(String name,String manufacturer,String supplier,int purchase_price,int selling_price,int sale_date) { 
    this.name = name; 
    this.manufacturer = manufacturer; 
    this.supplier = supplier; 
    this.purchase_price = purchase_price; 
    this.selling_price = selling_price; 
    this.sale_date = sale_date; 
} 
+0

Das ist absolut richtig!Danke für deine Zeit :) – Far

+0

@Far Kein Problem. Die Lektion hier ist nicht so schnell, die Möglichkeit zu verwerfen, dass etwas die Ursache eines Fehlers ist. – synchronizer

+0

Ich behalte das im Hinterkopf – Far

0

Hier einige Nutzung von this Schlüsselwort, das ich aus dem

  1. this

    JavaTPoint nahm verwendet werden können aktuelle Klasseninstanzvariable zu verweisen.

  2. this kann verwendet werden, um Stromklassenmethode (implizit)

  3. this() können aktuellen Klasse Konstruktor aufgerufen verwendet werden, aufzurufen.

  4. this kann als Argument im Methodenaufruf übergeben werden.

  5. this kann als Argument im Konstruktoraufruf übergeben werden.

  6. this kann verwendet werden, um die aktuelle Klasseninstanz aus der -Methode zurückzugeben.

In Ihrem Food Konstruktor

expiration_date=this.expiration_date; 

sollte

this.expiration_date= expiration_date; 

und im Products Konstruktor alle die Zuordnung sollte

this.name = name; 
this.manufacturer = manufacturer; 
this.supplier = supplier; 
this.purchase_price = purchase_price; 
this.selling_price = selling_price; 
this.sale_date = sale_date; 

sein Wissen Sie th unter this.name beziehen sich auf Elementvariable Products Klasse (geerbt). Was hier passiert ist name = this.name; Sie sind Mitglied Wert der Parameterwert zuweisen. Aus dem Rahmen des Konstruktors ist es verschwunden. Werte, die vom Objekt kommen, werden nie in Mitgliedsvariablen gespeichert.

Verwandte Themen