Vererbung Stack Overflow

FatalError

Mitglied
Hallo, wir haben gerade als Thema "Vererbung", dabei soll die Klasse "Pkw" mehrere Kinder haben (Limousine,Kombi,Cabrio) und einige (Unter-)Variablen, dazu haben wir eine Art UML angefertig.
Das ganze habe ich nun soweit programmiert, aber an folgendem verzweifle ich:
Code:
Exception in thread "main" java.lang.StackOverflowError
at Motor.<init>(Motor.java:6)
...
... (weitere Stellen im Code, eigentlich überall wo Variablen übergeben werden)
Verstehe nicht was StackOverflow in diesem Zusammenhang nun bedeuten soll?
Mein Quellcode:
Anwendung.java:
Java:
public class Anwendung {

	public static void main(String[] args) {
		Anwendung anw = new Anwendung();
		anw.ausfuehren();
	}

	public void ausfuehren(){
		Pkw pkw = new Pkw();
		System.out.println(pkw.toString());
	}

}
Pkw.java:
Java:
public class Pkw {
	
	int Tueren,Plaetze,farbe,art,PS,Treibstoff;
	String Farbe,Art;
	Motor motor;
	Limousine limo;
	Cabrio cabrio;
	Kombi kombi;
	
	public Pkw(){
		
		farbe = 1;
		art = 2;
		PS = 120;
		Treibstoff = 1; //1: Benzin, 2: Diesel, 3: Elektro, 4: Gas
		
		motor = new Motor(PS,Treibstoff);
		
		switch(art){
			case 1 : limo = new Limousine(true);Art = "Limousine";return;
			case 2 : cabrio = new Cabrio(1);Art = "Cabrio";return;
			default : kombi = new Kombi(1);Art = "Kombi";
		}
		
		switch(farbe){
			case 1: Farbe = "schwarz";return;
			case 2: Farbe = "weiß";return;
			case 3: Farbe = "rot";return;
			default: Farbe = "blau";
		}
	}
	
	public String toString(){
		return"Art = "+ Art +" Farbe = "+Farbe+" "+motor.toString();
	}
}
Motor.java
Java:
public class Motor{
	int Leistung;
	String Art;
	
	public Motor(int l, int a){
		Leistung = l;
		switch (a){
			case 1 : Art = "Diesel"; return;
			case 2 : Art = "Benzin"; return;
			case 3 : Art = "Elektro"; return;
			default : Art = "Gas";
		}
	}
	
	public String toString(){
		return " Leistung="+Leistung+"PS , Art= "+Art+" ";
	}
}
Cabrio.java:
Java:
public class Cabrio extends Pkw {
	int dach;
	String Dach;
	
	public Cabrio(int a){
		dach = a;
		switch(dach){
			case 1 : Dach = "Stoff";return;
			default : Dach = "HardTop";
		}
	}
	
	public String toString(){
		return super.toString()+", Dach = "+Dach+", Türen = "+Tueren+", Plätze = "+Plaetze;
	}
}
Kombi.java:
Java:
public class Kombi extends Pkw {
	int reeling;
	String Reeling;
	
	public Kombi(int a){
		reeling = a;
		switch(reeling){ case 1 : Reeling = "Ja";return; default : Reeling = "Nein"; }
		Tueren = 4;
		Plaetze = 5;
	}	
	
	public String toString(){
		return super.toString()+", Reeling = "+Reeling+", Türen = "+Tueren+", Plätze = "+Plaetze;
	}
}
Limousine.java:
Java:
public class Limousine extends Pkw {
	boolean Schiebedach;
	
	public Limousine(boolean a){
		Schiebedach = a;
		Tueren = 2;
		Plaetze = 4;
	}
	
	public String toString(){
		if (Schiebedach==true){
			return super.toString()+", Schiebedach = Ja "+", Türen = "+Tueren+", Plätze = "+Plaetze;
		}else{
			return super.toString()+", Schiebedach = Nein "+", Türen = "+Tueren+", Plätze = "+Plaetze;
		}
	}
}


Danke im voraus für jede Hilfe!

Gruß
FatalError
 

eRaaaa

Top Contributor
DU erstellst in deinem Konstruktor in Pkw ein Cabrio, dies ist wiederum allerdings eine Unterklasse von Pkw. Wenn du eine Instanz einer Unterklasse erstellst, wird automatishc der Konstruktor der Superklasse aufgerufen (also wiederum der Konstruktorvon Pkw)....daraus resultiert also eine Endlosschleife bei dir....so funktioniert Vererbung nicht, wieso sollte ein Pkw selbst ein Cabrio-Instanz erstellen??
 

FatalError

Mitglied
DU erstellst in deinem Konstruktor in Pkw ein Cabrio, dies ist wiederum allerdings eine Unterklasse von Pkw. Wenn du eine Instanz einer Unterklasse erstellst, wird automatishc der Konstruktor der Superklasse aufgerufen (also wiederum der Konstruktorvon Pkw)....daraus resultiert also eine Endlosschleife bei dir....so funktioniert Vererbung nicht, wieso sollte ein Pkw selbst ein Cabrio-Instanz erstellen??
Wo muss ich denn die z.B. Limousinen-Instanz sonst erstellen - in der Anwendung Klasse?
Habe das jetzt mal versucht, dort wird dann auch in der Console angezeigt:
Code:
Art = Limousine, Farbe = schwarz , Leistung = 120PS , Treibstoff = Diesel
...aber die Eigenschaften von der Limousinen-Unterklasse werden nicht angezeigt...
Hier der geänderte Code:
Anwendung:
Java:
public class Anwendung {

	String Art;

	Limousine limo;
	Cabrio cabrio;
	Kombi kombi;
	
	public static void main(String[] args) {
		Anwendung anw = new Anwendung();
		anw.ausfuehren();
	}

	public void ausfuehren(){
		
		Pkw pkw = new Pkw();
		limo = new Limousine(true);
		Art = "Limousine";
		System.out.println("Art = "+Art+","+pkw.toString()); 
		
	}

}
pkw.java:
Java:
public class Pkw {
	
	int Tueren,Plaetze,farbe,PS,Treibstoff;
	String Farbe;
	Motor motor;

	
	public Pkw(){
		
		farbe = 1;
		PS = 120;
		Treibstoff = 1; //1: Benzin, 2: Diesel, 3: Elektro, 4: Gas
		
		motor = new Motor(PS,Treibstoff);
		
		switch(farbe){
			case 1: Farbe = "schwarz";return;
			case 2: Farbe = "weiß";return;
			case 3: Farbe = "rot";return;
			default: Farbe = "blau";
		}
		
	
	}
	
	public String toString(){
		return" Farbe = "+Farbe+" "+motor.toString();
	}
}
 

FatalError

Mitglied
Habs nun nochmal umgeschrieben und besser strukturiert...
Nun funktionierts, wie gewollt, danke nochmal @eRaaaa für den Tipp mit der Endlosschleife,
das wäre mir ansonsten nicht aufgefallen!
 

Neue Themen


Oben