# The constructor Bestellung(Bestellung.Produkt, Bestellung.Kunde) is undefined



## Dark Crystal (11. Dez 2009)

Hallo 

Ich habe folgende Aufgabe bekommen:


> Legen Sie eine Klasse Bestellung an und modellieren Sie innerhalb dieser Klasse einen Bestellvorgang in
> einem Online-Shop. Nutzen Sie dabei die Methoden in den vorgegebenen Klassen Kunde und Produkt,
> die Einzelheiten der Realisierung von Bestellung bleibt dabei Ihnen selbst ¨uberlassen.




Mein Quellcode sieht so aus:

```
public class Bestellung {
	public String bestellnummer;

	
	Bestellung()
	{	
		bestellnummer = "1000";
	}
	
	public class Kunde
	{
	    private String name;
	    private String vorname;
	    private String strasse;
	    private String plz;
	    private String ort;
	    private boolean stammkunde;

	    Kunde (String n , String v , String s , String p , String o , boolean st)
	    {
		name = n;
		vorname = v;
		strasse = s;
		plz = p;
		ort = o;
		stammkunde = st;
	    }

	    public String get_name()
	    {return name;    }

	    public String get_vorname()
	    {return vorname; }
	    
	    public String get_strasse()
	    {return strasse;  }
	    
	    public String get_plz()
	    {return plz;}
	    
	    public String get_ort()
	    {return ort;   }
	    
	    public boolean ist_stammkunde()
	    {return stammkunde;  }
	}

	public class Produkt
	{
	    private int nummer;
	    private double preis;
	    private String bezeichnung;
	    private int anzahl_verfuegbar;

	    Produkt (int n, double p, String bez, int v)
	    {
		nummer = n;
		preis = p;
		bezeichnung = bez;
		anzahl_verfuegbar = v;
	    }

	    public int get_nummer()
	    {return nummer;  }

	    public double get_preis()
	    {return preis; }

	    public String get_bezeichnung()
	    {return bezeichnung; }

	    public int get_anzahl()
	    {return anzahl_verfuegbar;}

	    public void set_anzahl (int neue_anzahl)
	    {anzahl_verfuegbar = neue_anzahl; }
	}
	
	public void Rechnung()
	{
		System.out.println(CD.get_nummer() + " " + CD.get_bezeichnung());
		System.out.println("Rechnung für Bestellung Nr. " + bestellnummer + "\n");
		System.out.print(Isabella.get_vorname()+ " ");
		System.out.print(Isabella.get_name());
	}

	public static void main(String[] args)
	{
		
		Produkt CD = new Produkt(6990 , 15.51 , "Töffi" , 4);
		Kunde Isabella = new Kunde("Edelstein" , "Isabella" , "darf ich nicht sagen" , "51111" , "Nibelheim" , true);
		Bestellung b = new Bestellung(CD , Isabella);

		b.Rechnung();
		{}

	}
}
```

Mein Problem:
Ich bekomme diese Fehlermeldung:


> The constructor Bestellung(Bestellung.Produkt, Bestellung.Kunde) is undefined.


Und weiß jetzt nicht so wirklich wie ich den Construktor richtig definiere.
Also, ich komme so weit wie ich jetzt bin und dann kommt ein großes schwarzes Loch, ich habe jetzt zwar schon stundenlang Foren, Google etc. durchgelesen aber irgendwie macht es gerade mal so gar nicht "klick".
Und da ich das alles erst seit ein paar Wochen lerne bin ich bei der ganzen Sache ziemlich wackelig auf den Beinen^^.
Wäre nett, wenn mir jemand das an diesem Beispiel erklären könnte, also was ich jetzt genau machen muss und warum.

Vielen Dank schonmal im voraus


----------



## w0ddes (11. Dez 2009)

EDIT: Sry, da hing wohl was mit meinem Internet!  Diesen Post bitte löschen oder ignorieren


----------



## Gonzo17 (11. Dez 2009)

Momentan hast du nur den Konstruktor "Bestellung()", du rufst aber in deinem Code einen Kostruktor mit zwei Parametern auf und den gibts eben nocht nicht. Alles was fehlt ist der entsprechende Konstruktor, den kannst du unter den ersten schreiben und der sieht so aus:


```
public Bestellung(Produkt produkt, Kunde kunde) {
		// hier den Code
	}
```

Edit:
Was mir jetzt noch so auffällt.. so wie du das machst, kann das nicht klappen. In deiner main-Methode möchtest du ja drei Objekte erstellen, ein Produkt, ein Kunde und eine Bestellung. Da Produkt und Kunde aber innere Klassen von Bestellung sind, kannst du nicht einfach eine Instanz von ihnen erstellen, dazu bräuchtest du erst einmal eine Instanz von Bestellung. Macht also keinen Sinn die beiden Klassen als innere Klassen zu definieren (ich glaube aber, dass dir das nicht bewusst war, dass es innere Klassen sind).

Edit2:
Ein weiteres Problem wird dann bei der Klasse "Rechnung" auf dich zukommen, weil du dort davon ausgehst, dass diese Klasse die Objekte "CD" und "Isabella" kennt. Ist aber nicht so, weil sie ja nur in der main-Methode definiert wurden. Und allgemein würde ich für jede Klasse, die später wiederverwendet werden soll (was ja bei "Kunde" und "Produkt" auch durchaus Sinn macht), eine eigene Datei anlegen und nicht alles in eine Datei schreiben.


----------



## w0ddes (11. Dez 2009)

Das Problem ist, wie die Exception schon sagt, dass der Konstruktor nicht definiert ist:

Du rufst einen Konstruktor mit Parametern auf:

```
new Bestellung(CD , Isabella);
```

aber dein Konstruktor

```
Bestellung()
    {   
        bestellnummer = "1000";
    }
```
"weiß nicht", was er mit diesen Parametern machen soll.


Das ganze müsste man in etwa so schreiben: 

```
Bestellung(Produkt produkt, Kunde kunde)
```
schreiben.

Außerdem sind da noch einige Abhängigkeiten drin, die man ändern KÖNNTE um das Programm allgemeiner zu machen. (ich hab jetzt grade keine Lust / Zeit, aber wenn du willst mach ich's heute nachmittag oder jemand andres machts hier bestimmt auch  )


----------



## Dark Crystal (11. Dez 2009)

Erstmal Danke für die sehr schnellen Antworten

Ich weiß ja gar nicht ob das jetzt so 100% richtig ist^^
Hatte aber auch einen Teil vergessen der wahrscheinlich für das Verständnis wichtig ist - mein Ziel ist das da: 


> Geben Sie nach jedem Bestellvorgang eine Rechnung aus.



Und ich habe da ja auch die Methode Rechnung gemacht (hoffe die ist auch so richtig) und in Rechnung soll ja z. B. bei "CD.get_nummer()" mit die CD Nummer ausgegeben werden.
Aber irgendwie kann Rechnung da nicht drauf zugreifen und eben auch bei den anderen Sachen (bis auf Bestellungsnummer) auch nicht.
Und jetzt muss ich ja irgendwie von den Klassen "Kunde" und "Produkt" die Attribute (Hoffe das ist jetzt richtig mit Attribute...die Variablen eben^^) in Bestellung kriegen. Aber ich weiß nicht wie^^
So habe ich mir das bis jetzt zumindest gedacht, kann natürlich auch totaler Müll sein.
....wie gesagt sehr wackelig^^


----------



## Dark Crystal (11. Dez 2009)

Gonzo17 hat gesagt.:


> Ein weiteres Problem wird dann bei der Klasse "Rechnung" auf dich zukommen, weil du dort davon ausgehst, dass diese Klasse die Objekte "CD" und "Isabella" kennt. Ist aber nicht so, weil sie ja nur in der main-Methode definiert wurden. Und allgemein würde ich für jede Klasse, die später wiederverwendet werden soll (was ja bei "Kunde" und "Produkt" auch durchaus Sinn macht), eine eigene Datei anlegen und nicht alles in eine Datei schreiben.



Also soll ich da mit Packages arbeiten?
Und dann quasi die Daten von Kunde und Produkt in Bestellung "importieren"?


----------



## Gonzo17 (11. Dez 2009)

Ne, nicht unbedingt mit Packages. Also, im Prinzip hast du ja so oder so ein Package (und wenns auch nur das default package ist) und da müssen eben alle deine Klassen rein. Ne neue Klasse kannste in Eclipse erstellen, indem du Rechtsklick auf das Package machst und dort auf New > Class klickst. Die Idee dabei ist, dass du eben deine Klassen sauber getrennt hast und nur dann Objekte von ihnen instanziierst, wenn du sie brauchst. Ich würde übrigens auf eine Klassen "Rechnung" verzichten, ich würde eher eine Methode in "Bestellung" schreiben, die "showBill()" oder so heisst.


----------



## Dark Crystal (11. Dez 2009)

Sooo ich glaube ich habe es endlich geschafft^^


```
public class Bestellung {
	String bestellnummer;
	
	Bestellung() 
	{ bestellnummer = "100"; }
	
	public void showBill(Produkt produkt , Kunde kunde) {
		System.out.print("Rechnungsnummer: " +bestellnummer+ "\n");
		System.out.print("Name: " +kunde.get_name()+ "," +kunde.get_vorname()+ "\n");
		System.out.print("Anschrift: " +kunde.get_strasse()+ "\n          " +kunde.get_plz()+ " " +kunde.get_ort()+ "\n\n");
		System.out.print("Ihre Bestellung: \n");
		System.out.print("Artikel: " +produkt.get_bezeichnung()+ "(" +produkt.get_nummer()+ ") " +produkt.get_preis()+ " €" );
	}
	
	public static void main(String[] args) {
		Produkt produkt = new Produkt(1001 , 15.51 , "Töffi" , 4);
		Kunde kunde = new Kunde("Edelstein" , "Isabella" , "Am Hexenhaus 33" , "51111" , "Nibelheim" , true);
		Bestellung b = new Bestellung();
		
		b.showBill(produkt , kunde);
		{}
	}
}
```
Kunde und Produkt habe ich wie beschrieben in Eclipse verstaut.

So ist das Ok oder?


----------



## Gonzo17 (11. Dez 2009)

Das schaut gut aus. Und wenns in Eclipse keinen Fehler wirft, dann sollte das auch klappen. Aber ich würde rein von der Logik das ein bisschen anders aufbauen. Im Moment is das so, dass du Bestellungen erzeugen kannst, aber die einzige Information, die eine Bestellung hat, ist die Bestellnummer. An welchen Kunden das geht und um was für ein Produkt es sich handelt weiss die Bestellung selbst nicht. Deswegen würde ich vorschlagen, dass du Variablen für das Produkt und den Kunden anlegst und die dann im Konstruktor initialisierst (so wie du es vorhin machen wolltest, aber da fehlte der Konstruktor ja). Und dann musst du bei "showBill()" auch keine Parameter übergeben, sondern rufst die Methode einfach so auf.

Achja, was mir da noch so einfällt. Am besten nimmst du für Namen von Variablen, Klassen, Methoden, usw immer englische Bezeichner. Wenn du deutsche Namen nimmst, dann immer deutsch, aber tut man selten. War jetzt aber auch meine Schuld, weil ich dir nen englischen Methodennamen vorgeschlagen hab. ^^


----------



## Dark Crystal (14. Dez 2009)

Also dann so oder? 


```
public class Bestellung {
	private String bestellnummer;
	private String vorname;
	private String name;
	private String straße;
	private String plz;
	private String ort;
	private String bezeichnung;
	private int nummer;
	private double preis;
	
	Bestellung(Produkt produkt , Kunde kunde) {
		this.name = kunde.get_name();
		this.vorname = kunde.get_vorname();
		this.straße = kunde.get_strasse();
		this.plz = kunde.get_plz();
		this.ort = kunde.get_ort();
		this.bezeichnung = produkt.get_bezeichnung();
		this.nummer = produkt.get_nummer();
		this.preis = produkt.get_preis();
		bestellnummer = "100";
	}
	
	public void zeigeRechnung() {
		System.out.print("Rechnungsnummer: " +bestellnummer+ "\n");
		System.out.print("Name: " +name+ ", " +vorname+ "\n");
		System.out.print("Anschrift: " +straße+ "\n           " +plz+ " " +ort+ "\n\n");
		System.out.print("Ihre Bestellung: \n");
		System.out.print("Artikel: " +bezeichnung+ "(" +nummer+ ") " +preis+ " €" );
	}
	
	public static void main(String[] args) {
		Produkt produkt = new Produkt(1001 , 15.51 , "Töffi" , 4);
		Kunde kunde = new Kunde("Edelstein" , "Isabella" , "Am Hexenhaus 33" , "51111" , "Nibelheim" , true);
		Bestellung b = new Bestellung(produkt , kunde);
		
		b.zeigeRechnung();
		{}
	}
}
```


----------



## w0ddes (14. Dez 2009)

Sieht doch ganz gut aus


----------



## Gonzo17 (14. Dez 2009)

Ja das sieht gut aus auf den ersten Blick 
Zwei kleine Schönheits"fehler" hab ich noch gefunden. In Zeile 39 ist ein Block, der nichts tut, die Zeile kannste einfach löschen. Und deine get-Methoden der Kunden-Klasse sehen ja alle so aus: "get_Var()". Ich würde aber eher schreiben "getVar()", also ohne "_", das ist aber denke ich nicht so wichtig und nur ne Sache des Aussehens.


----------



## Suinos (14. Dez 2009)

Abgesehen von solchen Unschönheiten:


			
				Dark Crystal hat gesagt.:
			
		

> ```
> .get_name()
> [...]
> .get_bezeichnung()
> ```


, fallen mir noch diese Klammern auf, die im leeren Raum stehen:


			
				Dark Crystal hat gesagt.:
			
		

> [java=39]
> {}
> [/code]



Ausserdem:
Versuch einmal, die Rechnung zweimal nacheinander aufzuzeigen, also etwa so:

```
b.zeigeRechnung();
b.zeigeRechnung();
```

Was fällt dir auf?

@edit: bah, Vordrängler


----------



## Dark Crystal (14. Dez 2009)

Ok, hab die Sachen geändert^^



Suinos hat gesagt.:


> Versuch einmal, die Rechnung zweimal nacheinander aufzuzeigen, also etwa so:
> 
> ```
> b.zeigeRechnung();
> ...



Das einzige was mir auffällt ist, dass die Rechnung(en) nicht sauber untereinander dargestellt werden.
Hab das jetzt mit einem Absatz gelöst.
Oder hätte mir da noch was anderes auffallen sollen?


----------



## Gonzo17 (14. Dez 2009)

Ich denke das meinte er. Alternativ kannst du statt print auch println benutzen, schau dir mal an was da passiert. Damit kannste du es dir nämlich sparen am Ende immer ein "\n" hinzuzufügen.


----------



## Dark Crystal (14. Dez 2009)

Ja, das war meine Lösung^^


```
public void zeigeRechnung() {
		System.out.print("Rechnungsnummer: " +bestellnummer+ "\n");
		System.out.print("Name: " +name+ ", " +vorname+ "\n");
		System.out.print("Anschrift: " +straße+ "\n           " +plz+ " " +ort+ "\n\n");
		System.out.print("Ihre Bestellung: \n");
		System.out.println("Artikel: " +bezeichnung+ "(" +nummer+ ") " +preis+ " €" );
		System.out.println("------------------------");
```
Ich hatte das vorher mit den /n gemacht, weil ich das auch mal "Üben" wollte bzw. gucken ob das auch so geht^^.

So, dann vielen Dank für eure Hilfe und die ganze Geduld ich denke ich habe es jetzt verstanden


----------

