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.
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]
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.