OOP Zwei gleichnamige Objekte auf dem heap

blade_mz

Mitglied
Moin,

das ist vielleicht wirklich eine blöde Newbie Frage, aber sie brennt mir gerade ein bisschen auf der Seele:

Kann ich zwei gleichnamige Objekte haben, die nebeneinander auf dem heap existieren?

Beispiel dazu:

Java:
public class Main{

public static void main(String[] args) {		
Haus miniHaus = new Haus();
Haus Villa = new Haus();      
}

}

public class Haus{

Tuer eingangstuer;

public Haus(){
eingangstuer = new Tuer();
}

}

public class Tuer{
// irgendein Code
}

Jetzt gibt es ja in dem Beispiel zwei Objekte vom Typ Tuer mit dem Namen
Code:
eingangstuer
. Sind das denn wirklich zwei verschiedene Objekte oder wird aufgrund des gleichen Namens auf ein und das selbe Objekte referenziert. Sprich, wenn die Tuer jetzt noch eine Variable
Code:
Boolean offen
hätte, könnte die entweder bei allen Häusern
Code:
true
oder aber bei allen Häusern
Code:
false
sein, aber nicht ein Haus true und ein Haus false.

Hoffe, ich hab das nicht zu kompliziert erklärt:autsch:

Schönen Gruß
Matthias
 
Ja, dass ist möglich.
Es handelt sich dabei um 2 Eigenschaften verschiedener Objekte.
Du entdeckst gerade die Objekt(Klassen) Grundlagen und vor allem Vorteile.
Du kannst so viele Objekte mit gleichen Eigenschaften erzeugen bis der Speicher platzt.


Beispiel: Du hast 2 Objekte der Klasse Auto. (ganz einfach)
Auto 1 fährt.
Auto 2 fährt nicht.

Obwohl beide Auto Objekte die gleichen Eigenschaften: fahren, anhalten
besitzen können diese unterschiedliche Status haben.


Noch eine Anmerkung:
Was anderes wäre wenn du eine Zuweisung mit "=" durchführst. Damit überschreibst du die Speicheradresse (Referenz) selbst und hast somit nur noch 1 Objektadresse.
Auto 1 = Auto 2 (im Sinne von: das Selbe)
 
Zuletzt bearbeitet:
Jetzt gibt es ja in dem Beispiel zwei Objekte vom Typ Tuer mit dem Namen
Code:
eingangstuer
. Sind das denn wirklich zwei verschiedene Objekte oder wird aufgrund des gleichen Namens auf ein und das selbe Objekte referenziert.

Nein, Du hast nur ein Tuer-Objekt und eine Referenzvariable vom Typ Tuer welche auf das Objekt zeigt.

Hier
[JAVA=12]Tuer eingangstuer;[/code]
deklarierst du lediglich die Referenzvariable. Zu diesem Zeitpunkt ist eingangstuer=null. Du hast noch gar kein Tuer-Objekt.

Hier
[JAVA=15]eingangstuer = new Tuer();[/code]
weist du deiner zuvor deklarierten Referenzvariable ein neues Tuer-Objekt zu. Ab jetzt hast du ein Tuer Objekt, auf welches du über die Variable eingangstuer zugreifen kannst.

Würdest du soetwas machen:
[JAVA=15]
eingangstuer = new Tuer(); //1. Tuer-Objekt
eingangstuer = new Tuer(); //2. Tuer-Objekt
[/code]
hättest du auch nur ein Objekt, da durch die erneute Zuweisung, die erst Referenz verloren geht und damit auch das 1. Tuer-Objekt, es sei denn eine andere Variable hat noch eine Referenz auf das erste Objekt. Sprich, eine Variable verweist immer nur auf ein Objekt und zwar das, welches ihm zuletzt zugewiesen wurde. Gibt es keinen Verweis mehr auf ein Objekt, hast du keinen Zugriff mehr drauf und der Garbage-Collector vernichtet es.
 
Und um noch auf die Frage zu kommen, Du kannst im selben Code mehrfach den selben Variablennamen benutzen. Zum Variablennamen kommt dann nämlich noch der Gültigkeitsbereich, der eine eindeutige Auswahl erlaubt. Dazu Dein Beispiel etwas weiter gesponnen:
Java:
public class Haus{
  // (1) Instanzvariable, Name muss innerhalb der Klasse eindeutig sein. 
  private Tuer eingangstuer;
  
  // (2) Konstruktor-Parameter, Name ist innerhalb des Konstruktors eindeutig.
  //      Was anderes als (1)!
  public Haus(Tuer eingangstuer) {
    
    // Referenz auf die Instanzvariable
    // mit this.
    this. eingangstuer =
       // Referenz auf den Konstruktorparameter (2)
        eingangstuer;
  }
}
 
public class Tuer{
// irgendein Code
}
 
Hey,

Danke für die schnellen Antworten. So langsam schau ich bei der ganzen Sache auch durch, anstatt nur Code zu schreiben, und sich zu freuen, dass es klappt, ohne wirklich die Hintergründe zu verstehen.

Beste Grüße
 

Neue Themen


Zurück
Oben