Ich brauche Hilfe bei Objektorientierter Programmierung...

Funktionierdochmal

Bekanntes Mitglied
Hey Leute. Ich bin Informatikstudent und habe eine Objektorientierte Javahausaufgabe zu bewältigen. Ich finde trotz Folien und Googlesuche keinen Überblick und Zusammenhang über dem was ich tue. Ich weiß es ist zu viel verlangt, aber ich würde mich sehr über eine (kurze) persönliche Hilfe freuen. Jemand, der sich meine Sachen anschaut und Fragen beantwortet. Ich möchte nicht viel eurer Zeit wegnehmen. Ich finde es schwierig meine Fragen zu formulieren. Über eine Kontaktaufnahme würde ich mich freuen.
Liebe Grüße
 
Na gut. Frage 1 von 999: Ich habe eine Klasse1, die zwar über das Attribut gewicht verfügt. Nun hat eine (erbende) Klasse2 den Wert 0 für gewicht. Eine andere (erbende) Klasse4 erbt nun von Klasse 3 und Klasse3 ebenso von Klasse1. Ich hoffe soweit verständlich. Nun muss ich für Klasse4 ein zufälliges Gewicht bestimmen (Methode dafür bestimmung einer zufälligen int-Zahl habe ich in einer Klasse5 deklariert). Aber ich komme zuerst auf Klasse2 zurück: Meine Klasse1 hat nur die Methode getGewicht mit return 0. Wie mache ich für Klasse2 klar, dass er den Wert 0 hat?
Die Hausaufgabe ist irgendwie sehr vielfältig, ich müsste hier sehr viel schreiben damit euch das klar wird
 
Ich habe ja nicht einmal eine SetterMethode, wie soll ich für erbende Klassen ein gewicht zuweisen können (nur mithilfe der Methode getgewicht?) mit this.gewicht = gewicht irgendwie? idk
 
Was für einen Zugriffsmodifier soll gewicht denn haben? Ist das festgelegt? Sollte gewicht protected sein, kannst du in jeder Du klasse von Klasse 1 auf gewicht zugreifen
Java:
class Class1 {
    protected int gewicht; 
    ... 
}
class Claas2 extends Class1 {
    public Class2() {
        super.gewicht = 2;
    } 
}
 
Robat ja ich habe es auf protected. Aber das gewicht darf ich so wie du es getan hast nicht festlegen. Es wird durch Zufall mit einer anderen Methode einer anderen Klasse festgelegt.
Java:
    GewichtigesWeihnachtsObjekt(int gewicht) {
        this.gewicht = gewicht;
    }
das akzeptiert er irgendwie nicht, weil er einen super constructor möchte, verstehe ich leider in diesem Zusamenhang auch nicht:

zu temi: kannst du die Frage anders/präziser formulieren?
 
zu temi: kannst du die Frage anders/präziser formulieren?
Hat die Klasse1 einen Konstruktor, der möglicherweise das Gewicht als Parameter entgegen nimmt?
Java:
class Klasse1 {
   private int gewicht;

   // Konstruktor
   public Klasse1(int gewicht) {
      this.gewicht = gewicht;
   }

   public int getGewicht() {
      return this.gewicht;
   }
}

Entspricht dies ungefähr deiner Klasse1?
 
Tut mir Leid moment, ich habe die Methode getGewicht mit return 0; gesetzt, weil ja eine andere Klasse das Gewicht 0 hat. Dafür habe ich in der anderen Klasse(die ein Gewicht hat) die getGewicht Methode mit einem @Override ergänzt.
 
Java:
class Klasse2 extends Klasse1 {
   // Konstruktor, der den Konstruktor der vererbenden Klasse aufruft. Hier mit dem Initialwert "0".
   public Klasse2() {      
      super(0);
   }
}

Der Hinweis von @Robat gilt allerdings auch weiterhin. Da das Gewicht in der Klasse1 "protected" ist, kannst du es natürlich auch direkt in der anderen Klasse setzen.
 
Zuletzt bearbeitet:
zu meiner nächsten Frage. Zuerst ein kleiner Abschnitt: "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." Geschenk erbt in diesem Fall von GewichtigesWeihnachtsObjekt und soll dann beim Erstellen eines Geschenks ein zufälliges Gewicht erhalten. "this.gewicht = XMasUtils.getZufallsGanzzahl(1, 20);" "WeihnachtsObjekt erstesGeschenk = new WeihnachtsObjekt(this.gewicht);" Das wären meine Notizen dazu, kann mir da wer helfen?
 
Also, mal kurz zum Verständnis: ein Objekt besitzt Zustand und Verhalten (=> Attribute und Methoden). Davon zu unterscheiden ist die Klasse, die man sich als Vorlage für Objekte vorstellen kann.

Wird nun eine Instanz der Klasse erstellt, wird der Zustand des neu erstellten Objekts initialisiert. Auf diese Initialisierung kann über Konstruktoren Einfluss genommen werden. Jede Klasse besitzt wenigstens einen Konstruktor, wurde keiner im Code angegeben, ist dies der parameterlose Standardkonstruktor.

Das Beispiel von @temi in Kommentar #12 zeigt die Klasse1, die über einen einzigen Konstruktor verfügt, der einen int-Parameter für das Gewicht erwartet. Zur Erzeugung eines Objekts der Klasse1 muss also ein Gewicht angegeben werden. Man muss sich klar machen, dass alle Objekte dieser Klasse und aller Subklassen über das Attribut gewicht verfügen, man in den Subklassen darauf aber nicht mehr (direkt) zugreifen kann, weil gewicht private deklariert wurde. Außerhalb der Klasse1 kann via getGewicht() der Attributwert des Attributs gewicht ermittelt werden.

In Kommentar #16 von @temi siehst Du die von Klasse1 abgeleitete Klasse2. Objekte der Klasse2 verfügen nach wie vor über das gewicht-Attribut, ein direkter Zugriff darauf ist jedoch nicht möglich. Natürlich kann man nach wie vor der Attributwert via getGewicht() ermitteln.

super(...) dient nun dazu, einen Konstruktor der Superklasse aufzurufen - im Kontext des aktuellen (bzw. gerade zu erzeugenden) Objekts. Wird ein neues Klasse2-Objekt erzeugt, wird für dieses Objekt im Konstruktor der Klasse2 der Konstruktor der Klasse1 aufgerufen, der einen int-Wert erwartet. Dieser initialisiert dann das Gewicht. Übrigens: wird kein super(...) angegeben, wird automatisch der parameterlose Konstruktor der Superklasse aufgerufen.

Setze ich nun hiermit für die Klasse3 ein Gewicht?
Wenn Klasse3 (ich nehme mal an, dass damit GewichtigesWeinachtsObjekt gemeint ist) von Klasse1 abgeleitet ist, dann hast Du in Klasse3 keinen Zugriff auf this.gewicht (siehe Erklärung oben). Du willst das Gewicht aber nicht "setzen" (im Sinne von verändern), sondern initialisieren. Um das zu erreichen, verwendest Du einfach den Konstruktor der Superklasse und schreibst super(gewicht);.
 

Zurück
Oben