Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Moin Leute,
Folgendes Problem: Ich habe zwei Klassen. Einmal das WeihnachtsObjekt und einmal das GewichtigeWeihnachtsObjekt (abgekürzt GWO). Die Klasse WeihnachtsObjekt sieht so aus
Java:
package de.weihnachten;
public class WeihnachtsObjekt {
private int gewicht;
public WeihnachtsObjekt(int gewicht) {
super();
}
public int getGewicht() {
return 0;
}
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:
Java:
public class GewichtigesWeihnachtsObjekt extends WeihnachtsObjekt {
public GewichtigesWeihnachtsObjekt(int gewicht) {
this.gewicht = gewicht;
}
@Override
public int getGewicht() {
return this.gewicht;
}
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:
Java:
public abstract class WeihnachtsObjekt {
public int getGewicht() {
return 0;
}
}
public class GWO extends WeihnachtsObjekt {
private int gewicht;
public GWO(int gewicht) {
this.gewicht = gewicht;
}
public int getGewicht() {
return gewicht;
}
}
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".
Java:
package de.weihnachten;
public class Geschenk extends GewichtigesWeihnachtsObjekt {
public Geschenk(int gewicht) {
this.gewicht = XMasUtils.getZufallsGanzzahl(1, 20);
}
Mir wird angezeigt, dass ich gewicht unbedingt auf protected setzen muss, ich verstehs nicht...
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:
Java:
public abstract class WeihnachtsObjekt {
public int getGewicht() {
return 0;
}
}
public class GWO extends WeihnachtsObjekt {
private int gewicht;
public GWO(int gewicht) {
this.gewicht = gewicht;
}
public int getGewicht() {
return gewicht;
}
}
public class Geschenk extends GWO {
public Geschenk() {
super(XMasUtils.getZufallsGanzzahl(1, 20));
}
}
Vielen Dank für deine Antwort. Woher weiss man aber, dass mit
public Geschenk() {
super(XMasUtils.getZufallsGanzzahl(1, 20));
mein gewicht gemeint ist?
package de.weihnachten;
public class WeihnachtsObjekt {
public int getGewicht() {
return 0;
}
Java:
package de.weihnachten;
public class GewichtigesWeihnachtsObjekt extends WeihnachtsObjekt {
private int gewicht;
public GewichtigesWeihnachtsObjekt(int gewicht) {
this.gewicht = gewicht;
}
public int getGewicht() {
return this.gewicht;
}
Java:
package de.weihnachten;
public class Geschenk extends GewichtigesWeihnachtsObjekt {
public Geschenk() {
super(XMasUtils.getZufallsGanzzahl(1, 20));
}
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:
Java:
package de.weihnachten;
public class Rentier extends GewichtigesWeihnachtsObjekt {
private double hunger;
public Rentier() {
super(XMasUtils.getZufallsGanzzahl(1, 20));
super(XMasUtils.getZufallHunger(1.0, 2.0));
}
public double getHunger() {
return hunger;
}
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.