Vererbung - Unresolved compilation problem

RagnaroekC

Mitglied
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Implicit super constructor Mensch() is undefined. Must explicitly invoke another constructor...

Hey ihr, lese nun seit geraumer Zeit im google. Kann mein Problem dennoch nicht beheben.

Die Klasse Mensch soll beerbt werden.

Java:
class Mensch {
	private int alter;
	private char geschlecht;
	private String name;

	
	public Mensch(int alter, char geschlecht, String name) {
		setAlter(alter);
		setGeschlecht(geschlecht);
		setName(name);
	}
	public int getAlter() {
		return alter;
	}
	void setAlter(int alter) {
		this.alter = alter;
	}
	public char getGeschlecht() {
		return geschlecht;
	}
	void setGeschlecht(char geschlecht) {
		this.geschlecht = geschlecht;
	}
	public String getName() {
		return name;
	}
	void setName(String name) {
		this.name = name;
	}
	public String getTyp() {
		String typ = "Mensch";
		return typ;
	}
}

und zwar durch die Klasse Student

Java:
//Die Klasse Student erweitert die Klasse Mensch, wodurch sie 
//alle Attribute unter Berücksichtigung der Sichtbarkeit erbt.

public class Student extends Mensch {

	// Die Klasse Student erweitert die Klasse Mensch und folgende Attribute:
	private String Martrikelnummer = "";
	private String s = "Student";
	
	
	
	
	// ... und Methoden
	public void setMatrikelnummer(String Martrikelnummer)
	{
		this.Martrikelnummer = Martrikelnummer;
	}
	
	public String getMatrikelnummer()
	{
		return Martrikelnummer;
	}
	
	public String getTyp()
	{
		return s;
	}
	

	
	
	//... sowie diesem Konstruktor
	
	//HIER IRGENDWO LIEGT DER FEHLER
	Student(int alter, char geschlecht, String name) //, String Matrikelnummer)
	{
		// Die Attribute der Klasse Mensch sind durch die Vererbung hier nutzbar.
		setAlter(alter);
		setGeschlecht(geschlecht);
		setName(name);
		//setMatrikelnummer(Matrikelnummer);
		
	}
	

	
	
}

Außerdem soll um die Matrikelnummer erweitert werden. Habe sie hier erst einmal auskommentiert, da bereits alles ohne diese schon nicht funktioniert.

Die Sache ist nun die, ich weiß, dass automatisch ein Standartkonstruktor initialisiert muss, welchen man mindestens aufrufen muss, da sonst diese Fehlermeldung erscheint. Vermutlich weil man ja vererben möchte und das ganze sonst keinen Sinn ergibt. Ich habe gelesen, dass man deshalb alternativ auch einen anderen Konstruktor der Superklasse aufrufen kann, wodurch die Superklasse dann genutzt wird. Dieses versuchte ich, allerdings ohne Erfolg.

Ich hoffe ihr könnt mir erläutern warum dies gerade nicht funktioniert und wie man es abändern kann, damit es funktioniert.


Liebe Grüße

Ragnaroek


P.s.: Ich weiß, dass das Problem behoben ist, wenn man einen Standartkonstruktor in der Superklasse initialisiert. Also in dem Fall
Mensch()
{
}
da dieser dann erreichbar ist. Allerdings darf die Superklasse natürlich nicht verändert werden.
 
Zuletzt bearbeitet:
Du musst dann den Konstruktor
Code:
public Mensch(int alter, char geschlecht, String name)
explizit aufrufen. Aussehen könnte das ganze dann so:
Java:
Student (int alter, char geschlecht, String name, String Matrikelnummer) {
  super(alter, geschlecht, name);
  setMatrikelnummer(matrikelnummer);
}
 
Danke, ich habe wohl alles ausprobiert außer diese Variante. ^^

Eine kleine Frage vielleicht noch:

Wenn wir keinen Standard-Konstruktor in der Oberklasse anbieten, müssen wir in der Unterklasse mittels super(Argument ...) einen speziellen, parametrisierten Konstruktor aufrufen.

Warum?

Ich meine, nur weil die Java-Macher sich das so ausgedacht haben, dass man einen Konstruktor aufrufen muss oder steckt da irgend ein tierferer Sinn hinter?
 
Zuletzt bearbeitet:
Kleiner Auszug aus Using the Keyword super (The Java™ Tutorials > Learning the Java Language > Interfaces and Inheritance):

Note:

If a constructor does not explicitly invoke a superclass constructor, the Java compiler automatically inserts a call to the no-argument constructor of the superclass. If the super class does not have a no-argument constructor, you will get a compile-time error.
Code:
Object
does have such a constructor, so if
Code:
Object
is the only superclass, there is no problem.

--------------------------------------------------------------------------------

If a subclass constructor invokes a constructor of its superclass, either explicitly or implicitly, you might think that there will be a whole chain of constructors called, all the way back to the constructor of
Code:
Object
. In fact, this is the case. It is called constructor chaining, and you need to be aware of it when there is a long line of class descent.
Bevor eine Instanz einer Unterklasse erzeugt werden kann, muss alles aus den Oberklassen initialisiert werden. Die Unterklasse will schließlich das Verhalten erben.
Deshalb wird die Klassenhierarchie aufwärts über Konstruktor-Aufrufe durchlaufen. Um dies sicherzustellen, fügt der Compiler ein
Code:
super()
in die Konstruktoren der Unterklasse ein, wenn diese keinen expliziten
Code:
super()
- oder
Code:
this()
-Aufruf haben. Hat die Oberklasse dann nicht den Standardkonstruktor, schlägt die Kompilierung fehl.

Als Ergänzung ist hier wohl auch eine Erklärung von
Code:
this()
angebracht: Using the this Keyword (The Java™ Tutorials > Learning the Java Language > Classes and Objects)
Kurz: Ruft einen anderen Konstruktor derselben Klasse auf.
 
Zuletzt bearbeitet:

Zurück
Oben