OOP erste Versuche, OOP zu verstehen. Probleme mit gettern und settern

3rdtimesacharm

Neues Mitglied
Guten Abend,

ich bin im ersten Semester Informatik und wir fangen gerade erst an mit OOP.

Als Beispiel soll eine Familie modelliert werden. Die wird über's Semester immer komplexer.

Im Moment haben wir eine Klasse Baby und eine Klasse Mutter.

Baby und Mutter bekommen beide eine Instanzvariable "name". Diese wird durch einen Übergabeparameter im Konstruktor der Klasse gesetzt. (Was bedeutet das genau?) Zusätzlich bekommt das Baby die Variable "hungrig". Das Baby ist standardmäßig hungrig.
Die Mutter kann das Baby füttern. Wenn das Baby gefüttert ist, ist es nicht mehr hungrig.
Die Mutter kann das Baby wecken und spricht dabei das Baby mit seinem Namen an.
Insgesamt hat die Mutter drei Babys und sie kann jedes Baby füttern und wecken.

Der obige Text dient der Vorarbeit zu dieser Aufgabe:
Erstellen Sie nun in einer main-Methode die Mutter "Mandy", indem Sie ein Objekt der Klasse "Mutter" erzeugen. Anschließen instanziieren Sie die Klasse "Baby" durch die drei Babys "Jason", "Jeremy" und "Jacqueline".

Außerdem hab ich noch die Hinweise, dass der Name der Babys über die getName()-Methode bereitgesetllt wird und ich die setHungrig()-Methode brauchen werde, damit die Mutter den Hungerzustand ändern kann.

Ich verstehe auch nicht den 2. Teil der Aufgabe. Was bedeutet "instanziieren" genau? Was muss ich hier machen? Ist es das, was ich getan habe?


Ich bin leicht überfordert mit dieser Aufgabe. 😟

Meine Überlegungen bisher:
[CODE lang="java" title="Klasse Baby"]public class Baby {
private String name;
private boolean hungrig = true;

public Baby(String name) {
this.name = name;
Baby jason = new Baby("Jason");
Baby jeremy = new Baby("Jeremy");
Baby jacqueline = new Baby("Jacqueline");
}

public void setHungrig(boolean hungrig) {
this.hungrig = false;
}

public String getName(String name) {
return name;
}
}[/CODE]

und:
[CODE lang="java" title="Klasse Mutter"]
public class Mutter {
private String name;

public Mutter(String name) {
this.name = name;
}

public void fuettern(){

}

public void weckeBaby() {

}

public static void main(String[] args) {
//ein Objekt der Klasse Mutter erzeugen, um die Mutter Mandy zu nennen:
Mutter name = new Mutter("Mandy");

System.out.println("Name der Mutter: " + name);
}

}[/CODE]

Wie ihr wahrscheinlich hier schon seht, druckt mir Sysout nicht das aus, was ich will. Denn ich hätte gern den Namen ausgedruckt, aber was mir angezeigt wird ist die Referenz, also packagename.Klassenname@vieleZahlen.

Ich habe das Gefühl, etwas grundsätzliches falsch verstanden zu haben. Support in der Vorlesung ist schwierig, wir haben reines Onlinesemester und in der Sprechstunde bin ich bisher noch nie dran gekommen, weil so viele vor mir schon im Sprachkanal waren.

Vielen Dank für eure Hilfe!
 
Also bezüglich der konkreten Frage: Wenn Du ein Objekt ausgibst, dann ist das per Default erst einmal der Klassenname@hashwert.

Wenn Du da eine andere Ausgabe haben möchtest, musst Du entweder die Methode toString überschreiben (Dann kann die Ausgabe so bleiben wie sie ist) oder Du musst bei der Ausgabe definieren, was Du wie ausgeben möchtest (Also z.B. bei dir dann name.name um die Instanzvariable name auszugeben.

Dann paar weitere Hinweise:

a) Variablen sinnvoll bezeichnen. In der Variable name speicherst Du ja nicht einen Namen sondern eine Mutter. Macht also wenig Sinn.

b) Der Konstruktor von Baby erzeugt nur das eigentliche Baby, das er erzeugen soll. Da irgendwelche weiteren Babies zu erzeugen macht logisch keinen Sinn. Und ist vom Ablauf her auch eine Endlosschleife. Du erzeugst ein Baby. Dann will er im Konstruktor das jason Baby erzeugen. Dazu wird ja wieder der Konstruktor aufgerufen und der erzeugt dann wieder ein jason Baby ... u.s.w.

Daher immer wirklich vor Augen führen, was das bedeutet: Wird immer, wenn Du ein baby erzeugst, drei weitere Babies erzeugt? Also jedes Baby kommt mit drei Babies (Jason, Jeremy und Jacqueline) zur Welt? Wohl kaum!
Wenn da etwas drin wäre wie: Bei der Erzeugung des Babies wird direkt mit erzeugt: Ein Herz, zwei Nieren, zwei Lungenflügel, ... Ja, das macht dann Sinn ...

Also versuch es Dir bildlich vorzustellen! So findest Du auch in der Regel sinnvolle Trennlinien zwischen Klassen und so ...
 
Was bedeutet "instanziieren" genau? Was muss ich hier machen? Ist es das, was ich getan habe?
Ja. Es bedeutet, wie du in deinem Kommentar geschrieben hast, dass du ein Objekt (oder Instanz) der Klasse erzeugst.
Java:
//ein Objekt der Klasse Mutter erzeugen
Mutter name = new Mutter("Mandy");
Der Konstruktorparameter ist ein String, der dem Namen der Mutter entspricht. Das String-Literal "Mandy" wird der Parametervariablen "name" zugewiesen und im Code des Konstruktors wird der Parameter "name" der Instanzvariablen "name" der Klasse Mutter zugewiesen. Das passt auch so.

Allerdings ist der Variablenname nicht ganz glücklich gewählt. Es handelt sich bei dem Objekt ja um eine "Mutter", insofern wäre folgendes sinnvoller:
Java:
Mutter mutter = new Mutter("Mandy");
Mutter mandy = new Mutter("Mandy");

Wenn du den Namen der Mutter ausgeben möchtest, dann musst du dazu den entsprechenden Getter verwenden (den es in dieser Klasse allerdings nicht gibt). Schau dir die Methode in "Baby" einmal an. Sie liefert als Rückgabetyp einen String und zwar den Namen, der in der Instanzvariablen der Klasse Baby gespeichert ist.
Java:
public static void main(String[] args) {
    // hier "Mutter" erzeugen
 
    //ein Objekt der Klasse Baby erzeugen
    Baby jason = new Baby("Jason");
      
    System.out.println("Name des Babys: " + jason.getName());
}

Ich würde dir außerdem noch empfehlen für die main()-Methode eine separate Klasse (z.B. "Main") zu nehmen, die dann die beiden anderen Klassen verwendet. So bleibt der Code der beiden anderen Klassen "sauber".
 
Zuletzt bearbeitet von einem Moderator:
Ich verstehe auch nicht den 2. Teil der Aufgabe. Was bedeutet "instanziieren" genau? Was muss ich hier machen? Ist es das, was ich getan habe?
Eine Klasse ist ein Bauplan für ein Objekt. Mein Prof sagte damals immer: Sie haben einen Bauplan für einen Bagger. Mit einem Bauplan können sie nur schwer ein Loch buddeln. Mit dem Bauplan können Sie sich aber ein oder mehrere Bagger bauen und damit recht einfach beliebig viele Löcher buddeln.

Instanziieren ist genau dieser Vorgang: Aus dem Bauplan (der Klasse) ein Objekt bauen. Das Objekt ist dann eine Instanz der Klasse.
 
Als Ergänzung zu den Vorgängerkommetaren.
Java:
public void setHungrig(boolean hungrig) {
        this.hungrig = false;
    }
Das ist kein echter setter, du verwendest den Parameter nicht, sondern setzt hungrig einfach immer auf false.
 

Zurück
Oben