Moin Leute,
Folgendes Problem: Ich habe zwei Klassen. Einmal das WeihnachtsObjekt und einmal das GewichtigeWeihnachtsObjekt (abgekürzt GWO). Die Klasse WeihnachtsObjekt sieht so aus
Alle meine Klassen (u.a. auch GWO) sollen von dieser Klassen erben, jedoch soll GWO ein eigenes Gewicht haben. Der Grund warum ich vorher super() und return 0 geschrieben habe: das WeihnachtsObjekt erbt an zwei weitere Klasse, die ein Gewicht von 0 haben, aber meine Klasse GWO hat ein EIGENES gewicht, das er ebenso an zwei weitere Klassen erbt, die auch ein gewicht HABEN. Allerdings wird mir ständig gezeigt, dass ich gewicht auf protected setzen muss, es aber laut Aufgabenstellung nicht darf. So sieht mein GWO aus:
Wie kann ich nun (ohne eine weitere Methode einzufügen) ein eigenes gewicht für GWO setzen und bei WeihnachtsObjekt ein gewicht von 0 haben?
Ich bedanke ich vielmals.
Wenn die Klasse WeihnachtsObjekt gar kein Gewicht haben soll (sondern einfach 0), warum gibst du ihm denn dann eine `gewicht` Instanzvariable? Die ist doch vollkommen unnötig. Deklariere diese Instanzvariable doch erst in einer Subklasse, welche auch ein konfigurierbares Gewicht haben soll. Falls die Schnittstelle aller deiner Klassen so aussehen soll, dass jedes WeihnachtsObjekt die Methode getGewicht() haben soll, welche aber einfach 0 für die Oberklasse WeihnachtsObjekt zurückliefert, mach es vielleicht so:
Ja, das dachte ich auch, nur sagt die Aufgstellung mir "Ein WeihnachtsObjekt ist alles was mit dem Weihnachtsmann zu tun hat, potentiell ein Gewicht hat und mit einem anderen WeihnachtsObjekt kollidieren kann". Aber wenns nicht anders geht, verschiebe ich die Variable in die Klasse GWO. Aber ich habe dennoch ein weiteres Problem dann: Ich habe eine Klasse Geschenk die von GWO erbt und: "Ein Geschenk hat ein zufälliges Gewicht in Kilogramm. Dieses wird beim Erstellen des Geschenks im Konstruktor bestimmt. Das Gewicht muss zwischen 1kg und 20kg (beides inklusive) liegen".
Der Grund für die Fehlermeldung ist, dass du in einer Subklasse versuchst, auf eine private Instanzvariable einer Superklasse zuzugreifen. Das geht nicht. Private Instanzvariablen dürfen nur von derselben Klasse zugegriffen werden, in der sie deklariert wurden.
Dann erzeuge doch einfach eine zufällige Variable und rufe den super-Konstruktor auf:
Vielen Dank für deine Antwort. Woher weiss man aber, dass mit
public Geschenk() {
super(XMasUtils.getZufallsGanzzahl(1, 20));
mein gewicht gemeint ist?
Und der Fehler wird dir ganz genau wo angezeigt? Die Fehlermeldung enthält eine Zeilennummer oder irgendwo im Editor in der IDE wird etwas rot unterkringelt. Es wäre hilfreich, wenn du die Fehlermeldung hier mal in eine Zeile in deinem gezeigten Code übersetzt. Aber aktuell ist es unmöglich, dass der Compiler diese Fehlermeldung für nur diesen gezeigten Code generiert. Die Fehlermeldung muss sich auf bis jetzt ungezeigten Code beziehen.
Oh sorry habs abgespeichert jetzt sind die Kringel weg.
Ich habe einige weitere Fragen, ich hoffe, du hilfst mir weiterhin!
Ich habe eine weiter Klasse Rentier:
Mein Rentier hat nicht nur ein Gewicht, sondern auch hunger. Nun wollte ich dasselbe wie beim Geschenk abtippen, aber beim zweiten super kommt eine Fehlermeldung:"Constructor call must be in the first statement in a constructor".
Liegt es daran, dass ich bei der Klasse GWO nur das Gewicht als Parameter habe, heisst muss ich es ergänzen? Oder gibt es einen anderen Weg?
Versuche doch erstmal zu recherchieren und zu verstehen, was super(...); überhaupt tut... Es ruft den Konstruktor der Superklasse (das hinter dem "extends") auf. Dieser Superkonstruktor hat offensichtlich nur ein Gewicht und keinen Hunger, da ja nicht jedes gewichtige Weihnachtsobjekt ein Rentier ist und Hunger hat.
Du muss also einfach nur der Instanzvariablen `this.hunger` im Konstruktor von Rentier den Zufallswert zuweisen. Das Ganze mit dem Hunger hat ja schließlich überhaupt nichts mehr mit der Superklasse zu tun.