Autohaus

Mit System.out.println(Objekt); wird automatisch die toString Methode deines Objektes aufgerufen. In deinem Fall ist die toString Methode vom Autohaus so geschrieben:
Code:
public String toString(){
    String longString = " Das Auto hat die ID:"+pkwgarage[0].id;

    longString = longString + "Makre:"+ pkwgarage[0].marke;
    longString = longString + "Modellname:" + pkwgarage[0].modell;
    longString = longString + "Farbe/Lack:" + pkwgarage[0].farbe;
    longString = longString + "Motorausführung:" + pkwgarage[0].motor;
    longString = longString + "Ausstattungsbezeichnung:"+pkwgarage[0].ausstattung;
    longString = longString + "Maximale Anzahl an Passagieren:" + pkwgarage[0].anzahlsitze;
    longString = longString + "Durchschnittsverbrauch:" + pkwgarage[0].verbrauch;
    longString = longString + "Felgenausführung:" + pkwgarage[0].felge;
    longString = longString + "Gesamtpreis:" + pkwgarage[0].preis;


return (longString);
}

Eine non-void Methode gibt dir immer das zurück, was du im return stehen hast. Also gibt die toString vom Autohaus automatisch longString zurück. Außerhalb der toString Methode kennt deine Klasse longString nicht, daher klappt der Aufruft System.out.println(longString) auch nicht.
Um mit System.out.println() das zu sehen, was du sehen möchtest, musst du also auf jeden Fall mit deinem erstellten Autohaus-Objekt arbeiten.

In #11 wurde das wie folgt gemacht:
Code:
//main-method
public static void main(String[] args) {
    //new Autohaus-object 
    Autohaus maier = new Autohaus();

    //add new Auto-object to maier
    maier.einparken(new Auto(Konstruktor));

    //return toString from first object in Autohaus-object maier
    System.out.println(maier.bestand.get(0));                     
}
Es wurde mit System.out.println(...) das erste Objekt des Bestandes vom Autohause Maier ausgegeben. get(0) steht hierbei für das erste Objekt, da in der Informatik immer bei 0 angefangen wird zu zählen.
Da du die toString-Methode von deinem Autohaus aufrufen möchtest, musst du der System.out.println() lediglich dein Autohaus-Objekt geben.
 
Zuletzt bearbeitet:
Danke, ich verstehe jetzt schonmal teilweise wie diese Methode funktioniert. Wie müsste ich also meinen Quellcode abändern, dass ich beim Aufrufen der Methode oder einer weiteren Methode diesen longString, bzw. den Wert mit System.out.println ausgeben kann ? müsste ich in die klammern dann Autohaus schreiben ?
Ergänzung ()

public class Autohaus{

Auto [] pkwgarage;
int anzahl;
int i;
String longString;

public Autohaus(int maxAnzahlAutos){
anzahl = maxAnzahlAutos;
i = 0;
pkwgarage = new Auto [anzahl];
}

public void feldFüllen (int ID, String Marke, String Modell, String Farbe, String Motor, String Ausstattung, int Anzahlsitze, int Verbrauch, String Felge, int Preis ){



pkwgarage=new Auto(ID, Marke, Modell, Farbe, Motor, Ausstattung,Anzahlsitze, Verbrauch, Felge, Preis);
if (i < anzahl-1){
i = i+1;}else{
System.out.println (" Das Autohaus ist nun voll. Es können keine weiteren Autos eingeparkt werden.");
}

}
public String toString(){

for (int j = 0;j<i;j++){
longString= "AutoID:"+pkwgarage[0].id+"\n";
;
longString = longString + "Marke:"+ pkwgarage[0].marke+ "\n";
longString = longString + "Modellname:" + pkwgarage[0].modell+"\n";
longString = longString + "Farbe/Lack:" + pkwgarage[0].farbe+"\n";
longString = longString + "Motorausführung:" + pkwgarage[0].motor+"\n";
longString = longString + "Ausstattungsbezeichnung:"+pkwgarage[0].ausstattung+"\n";
longString = longString + "Maximale Anzahl an Passagieren:" + pkwgarage[0].anzahlsitze+"\n";
longString = longString + "Durchschnittsverbrauch:" + pkwgarage[0].verbrauch+"\n";
longString = longString + "Felgenausführung:" + pkwgarage[0].felge+"\n";
longString = longString + "Gesamtpreis:" + pkwgarage[0].preis+"\n";

}
return (longString);

}
public void autoAusgeben(){

System.out.println(longString);




}


}
So sieht mein Quellcode nun aus.
Mein Ziel wäre es jetzt dass ich die to String Methode und die autoAusgeben methode in eine Methode packe, damit man nicht beide Methoden ausgeben muss, damit man die Daten über System.out.println() zurückbekommt. Dann möchte ich noch in der Klasse Kunde auf die Methode zugreifen können, damit der Kunde eine Art Liste erhält. Hat jemand eine Idee ?
Ergänzung ()

public class Kunde {

public Kunde(){


}
public void angebotAusgeben(){




}




}
Das ist die bisherige Klasse Kunde.
 
Die toString Methode gehört in die Auto Klasse. Du musst dann überall in der Methode "pkwGarage[0]" entfernen. Die Methode im Autohaus, autoAusgeben muss dann Sytem.out.println(pkwGarage[0]); aufrufen.

Mir ist nicht ganz klar, was den Ziel ist. Möchtest du die Autos auf der Konsole ausgegeben haben oder dass die Kunden darauf Zugriff haben? In dem Fall bräuchtest du die System.out.printlns nicht.
 
Ich habe deine Klassen nochmal anders neu geschrieben, um dir zu verdeutlichen wie die toString Methode funktioniert.

Code:
public class Car{
    private String make, model, engine;
    private int price;

    //constructor
    public Car(String make, String model, String engine,int price){
        this.make = make;
        this.model = model;
        this.engine = engine;
        this.price = price;
    }

    //toString method
    //@Override is needed if you rewrite an already existing method from a parent-class
    @Override
    public String toString(){
        return make + " " + model + ", " + engine + " (" + price + "€)";
    }

    //getter methods
    public String getMake() {
        return make;
    } //and so on...

    //setter methods
    public void setMake(String make) {
        this.make = make;
    } //and so on...
}

Code:
import java.util.ArrayList;
import java.util.List;

public class Dealer {
    private List<Car> stock = new ArrayList<>();

    //return the number of cars in stock
    public int numberStock(){
        return stock.size();
    }

    //add a new car to the List<Car> stock
    public void addCar(Car input){
        stock.add(input);
    }

    //toString method
    @Override
    public String toString(){
        String output = "";

        //for-loop to add every car in stock to the output-String
        for(int i=0; i<numberStock(); i++){
            output += stock.get(i) + "\n";
        }
        return output;
    }

    public static void main(String[] args) {
        //generate new objects(dealer and cars)
        Dealer john = new Dealer();
        Car one = new Car("VW", "Golf", "2.0 TDI", 5000);
        Car two = new Car("Opel", "Corsa", "1.2 16V", 2000);
        Car three = new Car("Audi", "A3", "1.8 TFSI", 7000);

        //add cars to the dealer
        john.addCar(one);
        john.addCar(two);
        john.addCar(three);

        //return toString from dealer object
        System.out.println(john);
    }
}

Hier habe ich erst die toString Methode der einzelnen Autos überschrieben. Die toString Methode des Autohauses ruft letzendlich die einzelnen Autos auf und gibt sie so aus:

VW Golf, 2.0 TDI (5000€)
Opel Corsa, 1.2 16V (2000€)
Audi A3, 1.8 TFSI (7000€)
 
Zuletzt bearbeitet:
Ok, danke.
Wäre das auch so möglich ?
public class Autohaus{

Auto [] pkwgarage;
int anzahl;
int i;
int j;
String longString;

public Autohaus(int maxAnzahlAutos){
anzahl = maxAnzahlAutos;
int i=0;
pkwgarage = new Auto [anzahl];
}

public void feldFüllen (int ID, String Marke, String Modell, String Farbe, String Motor, String Ausstattung, int Anzahlsitze, int Verbrauch, String Felge, int Preis ){



pkwgarage=new Auto(ID, Marke, Modell, Farbe, Motor, Ausstattung,Anzahlsitze, Verbrauch, Felge, Preis);

if (i < anzahl-1){
i = i+1;}else{
System.out.println (" Das Autohaus ist nun voll. Es können keine weiteren Autos eingeparkt werden.");
}
}
public String toString(){


longString= "AutoID:"+pkwgarage[j].id+"\n";
;
longString = longString + "Marke:"+ pkwgarage[j].marke+ "\n";
longString = longString + "Modellname:" + pkwgarage[j].modell+"\n";
longString = longString + "Farbe/Lack:" + pkwgarage[j].farbe+"\n";
longString = longString + "Motorausführung:" + pkwgarage[j].motor+"\n";
longString = longString + "Ausstattungsbezeichnung:"+pkwgarage[j].ausstattung+"\n";
longString = longString + "Maximale Anzahl an Passagieren:" + pkwgarage[j].anzahlsitze+"\n";
longString = longString + "Durchschnittsverbrauch:" + pkwgarage[j].verbrauch+"\n";
longString = longString + "Felgenausführung:" + pkwgarage[j].felge+"\n";
longString = longString + "Gesamtpreis:" + pkwgarage[j].preis+"\n";


return (longString);

}
public void autoAusgeben(){
if (j == i){
toString();
System.out.println(longString);}
for(j = 0;j<i;j++){
toString();
System.out.println(longString);}





}

So habe ich eine toString Methode und noch eine autoAusgeben Methode.
Mich würde interessieren ist, ob es geht, dass die Methode String nicht durchgeführt werden kann (von außen), sondern nur die Methode autoAusgeben ?
Ergänzung ()

Die Methode autoAusgeben möchte ich dann in den Konstruktor von Kunde referenzieren, sodass beim erstellen eines kunden Objektes die Daten ausgeben werden. Ist das möglich ?
 
Warum die Phobie gegen [CODE ]-Tags? Man kann doch seine eigenen Posts nicht mehr lesen.

Der Sinn der toString-Methode (oder generell Methoden mit Rückgabewert) hast du offenbar noch nicht verstanden. Was i und j sind, erfährt man auch erst, wenn man bis zum Ende gelesen hat. Hab keine Angst vor sprechenden Variablennamen, die beißen nicht.

Deinen neuesten Entwurf kannst du ehrlich gesagt in die Tonne treten, viel zu kompliziert und undurchschaubar. Vergiss toString im Autohaus, das ist für dein Vorhaben nicht nötig und verwirrt dich offenbar nur. private Methoden können nur innerhalb der eigenen Klasse aufgerufen werden. Instanzvariablen sollten übrigens auch private sein.

Die Methode autoAusgeben möchte ich dann in den Konstruktor von Kunde referenzieren, sodass beim erstellen eines kunden Objektes die Daten ausgeben werden.
Methoden können in Java nicht referenziert werden, nur aufgerufen. Wenn du dem Kunden das Autohaus im Konstruktor übergibst (alternativ Singleton), kannst du auch die Methoden davon aufrufen. Der Konstruktor ist für sowas eher nicht gedacht, möglich ist es.
 
Wo sollte ich die Methode toString dann verwenden. Also ist es nicht möglich, dass ich im Kunde diese Methode referenziere ?
 
cpuman990 schrieb:
Mich würde interessieren ist, ob es geht, dass die Methode String nicht durchgeführt werden kann (von außen), sondern nur die Methode autoAusgeben ?
Wie meinen? Welche Methode String? Es wäre schöner, wenn du statt nichtssagendem i und j den Variablen einen sinnvollen Namen geben würdest.

Die toString() Methode wäre in Auto sinnvoller. Dann kannst du in Autohaus schreiben:
Code:
      public void  autoAusgeben(){
         for (int i = 0; i < anzahlAutos; i++) {
              System.out.println(pkwgarage[i].toSring());
         }
      }

Versuch das aber nicht einfach blind abzuschreiben, sondern den Sinn dahinter zu verstehen. Nur so lernst du, warum das alles gemacht wird!
 
Zuletzt bearbeitet:
Danke ! Ja ich versuche es zu verstehen.Wenn ich diese Methode im Auto habe, also toString, dann kann ich sie ins Autohaus referenzieren und von dort nach Kunde ?
 
Methoden können in Java nicht referenziert werden. Natürlich kannst du die auch in der Klasse Kunde aufrufen, ist ja public. Der jetzige Inhalt spiegelt aber nicht den Sinn dieser speziellen Methode wider. Daher: umbenennen. Auch der Name "autoAusgeben" ist irreführend.
 
Nochmal: die toString Methode wird verwendet um eine Klasse als String zu repräsentieren. Wenn du also ein Auto ausgeben möchtest, gehört das in die Klasse Auto. Wenn du das Autohaus ausgeben möchtest gehört das in die Klasse Autohaus. Aktuell ist die Methode die in die Klasse Auto gehört im Autohaus. Diese Methoden können dann von überall aufgerufen werden (ich vermute das ist das was du mit "referenziert" meinst).

Mir ist aus deinem Code nicht klar, was die Variablen i und j bedeuten sollen. Ich vermute, dass i der erste freie Slot im array ist. Aber j?

Was soll dein Kunde machen? Soweit ich es verstehe soll er vom Autohaus eine Liste von Autos erhalten und diese auf der Konsole ausgeben. Stimmt das? Entsprechend müsste der code so aussehen:
Kunde
Code:
public class Kunde {

  final Autohaus autohaus;

  public Kunde(final Autohaus autohaus) {
    this.autohaus = autohaus;
  }

  public void printCurrentOffers() {
    System.out.println(autohaus);
  }
}
toString Auto:
Code:
public String toString(){
  longString= "AutoID:"+id+"\n";
  longString += "Marke:"+marke+ "\n";
  longString += "Modellname:" +modell+"\n";
  longString += "Farbe/Lack:" + farbe+"\n";
  longString += "Motorausführung:" + motor+"\n";
  longString += "Ausstattungsbezeichnung:"+ausstattung+"\n";
  longString += "Maximale Anzahl an Passagieren:" + anzahlsitze+"\n";
  longString += "Durchschnittsverbrauch:" + verbrauch+"\n";
  longString += "Felgenausführung:" + felge+"\n";
  longString += "Gesamtpreis:" + preis+"\n";
  return longString;
}
toString Autohaus:
Code:
public String toString() {
  String result = "";
  for(Auto auto : pkwGarage) {
    result += auto.toString() + "\n";
  }
  return result;
}

Und _bitte_ benutz die code-tags. Die stellen den Code den du postest lesbar dar.
 
Zuletzt bearbeitet:
Ok, danke. Ja ich versuche den Sinn der Methode zu verstehen, denke auch, dass ich ihn verstehe. Wie ist es aber jetzt möglich im Kunden im Konstruktor oder in einer extra Methode darauf zugreifen zu können, sprich die Methode autoAusgeben aufrufen zu können ?
 
Siehe #51, erster Codeblock. Musst nur eine Zeile abändern.
 
toString Auto habe ich bereits so geändert, allerdings verstehe ich die anderen 2 Quellcodes nicht, vor allem den ersten :(. Ich habe jetzt meinen Autohausquellcode wie von Lukas gepostet. Ich verstehen nun nicht wie ich diese Methode in Kunde aufrufen kann. Über das normale Referenzieren ist es ja blöd, weil ich dann vom Kunden ein neues Autohaus Objekt erstellen muss. Static geht auch nicht, da anzahl benötigt wird. Weiß jemand wie ich das programmieren kann, dass ich in Kunde eine Methode habe, die das kann. NemesisFs hat wahrscheinlich schon sowas gepostet , ich verstehe es nur leider nicht :(.
Ergänzung ()

Wie funktioniert dieser Quellcode in #51. ?
 
Das final kannst du ignorieren, ist erstmal nicht wichtig. Ansonsten verstehe ich nicht, was es da nicht zu verstehen gibt. Du hast das Grundgerüst ja vorgegeben. Nur der Methodenname ist auf Englisch. In der Klasse wird auch kein neues Autohaus erstellt. Und irgendwie muss ja eine Referenz zum referenzieren da sein.

In Autohaus.toString siehst die "hübschere" Variante einer Schleife. Das kannst du aber ignorieren, da das mit deinem jetzigen Array-Ansatz nicht funktionieren wird.
 
Wenn ich den Quellcode in Kunde übernehme wird es also funktionieren?
Ergänzung ()

Bzw. was muss ich dem Konstruktor übergeben. ?
 
Warum testet du es nicht?

Edit: Die Antwort steht im Konstruktor selbst.
 
Ja, habe bereits getestet, aber verstehe nicht was ich eingeben soll in den Konstruktor ?
 
cpuman990 schrieb:
Ja, habe bereits getestet, aber verstehe nicht was ich eingeben soll in den Konstruktor ?

In der Definition vom Konstruktor steht doch welche Parameter er erwartet, ein Objekt vom Typen Autohaus.
 
ok, ich verstehe gerade gar nichts mehr :D. Wie muss ich das dort reinschreiben. Ein Autohaus-objekt erstellen ?
Ergänzung ()

Ah, autohaus1 erstellen und das dann eintippen ? :D
Ergänzung ()

Wenn ich jetzt die Methode des Kunden aufrufe dann erhalte ich wieder etwas wie: @xxjjeie
Ergänzung ()

Was muss noch an der Methode verändert werden ?
 
Zurück
Oben