Hierarchie und Vererbung bei Klassen - Problem

Hallo! Ich soll ein simples Programm mit 2 Klassen (Mitarbeiter und Vorgesetzter) schreiben, welches die Hierarchie und Vererbung bei Klassen veranschaulichen soll. Die Klasse Vorgesetzter soll hierarchisch der Klasse Mitarbeiter untergeordnet werden, da ein Vorgesetzter ein Mitarbeiter mit speziellen Eigenschaften ist. Beim Compilieren beider Klassen erhalte ich jedoch folgende Fehlermeldung für die Klasse Vorgesetzter:
cannot find symbol -
symbol : constructor Mitarbeiter()
location: class Mitarbeiter

Hier der (sehr unvollständige) code der beiden Klassen:

public class Mitarbeiter {

protected String name;
protected String personalnummer;
protected Vorgesetzter vorgesetzter;
protected int bestelllimit;
protected final int LIMIT = 20;

/** Creates a new instance of Mitarbeiter */
public Mitarbeiter(String name, String personalnummer) {
this.name = name;
this.personalnummer = personalnummer;
this.bestelllimit = LIMIT;
}

public void setzeVorgesetzten(Vorgesetzter vorgesetzter) {
this.vorgesetzter = vorgesetzter;
}
}

public class Vorgesetzter extends Mitarbeiter {

/** Creates a new instance of Vorgesetzter */
public Vorgesetzter(String name, String personalnummer) {
this.name = name;
this.personalnummer = personalnummer;
}

public void setzteBestelllimit(int limit) {
}
}

Das Thema ist gerade neu für mich und ich bin relativ ratlos, was ich falsch gemacht habe. Hat es was mit den Parametern meiner Konstruktoren zu tun? Es wäre nett, wenn mit jemand kurz meinen Fehler erklären kann.

Hallo,

vermutlich fehlt einfach ein super(name, personalnummer); in der ersten Zeile des Konstruktors von Vorgesetzter.

Gruß

Peter

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Danke für Deine Antwort! Also ich weiss nicht so recht, wie Du das jetzt meinst.

public Vorgesetzter (String name, String personalnummer) {
this.name = name;
this.personalnummer = personalnummer;
this.bestelllimit = LIMIT;
this.istVorgesetzter = true;
}

Der Fehler wird im im Kopf des (mittlerweile leicht geänderten) Konstruktors angezeigt. Diese Klasse erbt doch die Instanzvariablen von der Klasse Mitarbeiter. Im Konstruktor werden die entsprechenden Parameter dann übergeben.

Wo soll ich dann das super unterbringen?? Im Kopf des Konstruktors? Das macht für mich keinen Sinn (das ist allerdings noch neu für mich, lasse mich gerne eines besseren belehren=). Es wäre nett, wenn Du mir das genauer erklären könntest.

Für mein Verständnis benutze ich super.methodenname(), wenn ich auf eine geerbte Methode zugreifen will. Ich habe doch aber hier einen Konstruktor mit anderer Signatur erstellt. An welcher Stelle greife ich denn auf eine geerbte Methode zu? Ich versteh das wohl alles noch nicht so ganz. Eine Erklärung wäre nett.

Wieso findet er den Konstruktor Mitarbeiter(String,String) nicht, oder besser, wieso sucht er überhaupt danach?? Ich habe doch einen neuen Konstruktor geschrieben, der sich lediglich der Instanzvariablen der Vaterklasse bedient. Innerhalb meines neuen Konstruktors anstelle von this.name super.name usw. zu schreiben, änder rein garnichts.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hey.

Werf doch vielleicht mal einen Blick hier rein: http://www.galileocomputing.de/openbook/javainsel5/j… .
Überhaupt ist das http://www.galileocomputing.de/openbook/javainsel5/ eigentlich immer recht gut zum Nachschlagen bei solchen Problemen.

Viel Erfolg,
Chris

1 „Gefällt mir“

Vielen Dank! Der korrekte Konstruktor sieht nun so aus:

public Vorgesetzter (String name, String personalnummer) {
super(name, personalnummer);
this.bestelllimit = LIMIT;
this.istVorgesetzter = true;
}

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Vielen Dank! Der korrekte Konstruktor sieht nun so aus:

public Vorgesetzter (String name, String personalnummer) {
super(name, personalnummer);
this.bestelllimit = LIMIT;
this.istVorgesetzter = true;
}

this.istVorgesetzter = true;
ist ein Entwurfsfehler.

Eine stark typisierte Sprache wie Java bedarf keiner isXY - Member. Diese sind im besten Falle redundant.

Wenn Du einen Mitarbeiter erzeugst, der ein Vorgesetzter ist:

Mitarbeiter chef = new Vorgesetzter (…);

dann kannst Du mit

if (chef instanceof Vorgesetzter)
prüfen, ob es ein Vorgesetzter ist.

Dagegen ist die Absicherung, daß für jeden Vorgesetzten das boolsche Flag true, und für jeden nicht-Vorgesetzten das Flag false ist, eine haarige Sache.
Vielleicht übersteigt diese Diskussion die Problemstellung, aber Java ist eine Objektorientierte Programmiersprache, und solche Konstrukte sind nicht objektorientiert.