Objects
Kurz: Eine konkrete Instanz einer Klasse, erzeugt mit dem new-Schlüsselwort — trägt eigene Werte in den Feldern, die die Klasse definiert.
Genauer: Zwei Objekte derselben Klasse sind unabhängige Speicherbereiche: Ändert man ein Feld des einen, bleibt das andere unberührt (sofern es keine geteilte Referenz ist). Objektvariablen in Java speichern eine Referenz auf das Objekt im Heap, nicht das Objekt selbst.
Auto meinAuto = new Auto("Blau", 4);Im Detail
class Auto {
String farbe;
int tueren;
Auto(String farbe, int tueren) { this.farbe = farbe; this.tueren = tueren; }
}
Auto meinAuto = new Auto("Blau", 4);
Auto deinAuto = new Auto("Blau", 4); // andere Instanz, gleiche Werte
System.out.println(meinAuto == deinAuto); // false - zwei verschiedene Objekte im Speicher
System.out.println(meinAuto.farbe.equals(deinAuto.farbe)); // true - Inhalt gleich
meinAuto.farbe = "Rot";
System.out.println(deinAuto.farbe); // "Blau" - unberührt, komplett unabhängiges ObjektJedes über new erzeugte Objekt bekommt zur Laufzeit einen eigenen Platz im Heap-Speicher, unabhängig davon, ob andere Objekte derselben Klasse identische Feldwerte tragen — meinAuto und deinAuto sind trotz gleicher farbe/tueren-Werte zwei komplett getrennte Objekte, was der ==-Vergleich (Referenzvergleich) korrekt als false zeigt. Eine Objektvariable wie meinAuto speichert dabei selbst nicht das Objekt, sondern nur eine Referenz (vereinfacht: eine Speicheradresse) darauf — kopiert man die Variable (Auto kopie = meinAuto;), kopiert man nur diese Referenz, nicht das Objekt dahinter (siehe Non-primitive Types für die Konsequenzen daraus).
Referenzen teilen sich ein Objekt
Weist man einer zweiten Variable eine bestehende Objektreferenz zu, zeigen beide Variablen danach auf DASSELBE Objekt — eine Änderung über die eine Variable ist über die andere sichtbar, weil es physisch nur ein Objekt im Speicher gibt:
Auto meinAuto = new Auto("Blau", 4);
Auto kopie = meinAuto; // kopiert nur die Referenz, NICHT das Objekt
kopie.farbe = "Grün";
System.out.println(meinAuto.farbe); // "Grün" - dieselbe Referenz, dasselbe Objekt!Das ist einer der häufigsten Anfänger-Stolperer: kopie “fühlt sich an” wie eine eigenständige Kopie, ist aber nur ein zweiter Name für exakt dasselbe Objekt. Eine echte, unabhängige Kopie braucht entweder einen eigenen Kopier-Konstruktor (new Auto(meinAuto.farbe, meinAuto.tueren)) oder eine clone()-Implementierung.
Der Lebenszyklus: Erzeugung, Nutzung, Garbage Collection
Ein Objekt existiert, solange mindestens eine Referenz darauf zeigt. Setzt man die letzte Referenz auf null oder überschreibt sie (wie bei kopie = null;), wird das Objekt für den Garbage Collector zum Entfernen “erreichbar” — anders als in Sprachen mit manueller Speicherverwaltung (C/C++) muss in Java kein delete/free aufgerufen werden, die JVM erkennt automatisch, wann ein Objekt von keinem Code mehr erreichbar ist, und gibt den Speicher irgendwann frei.
Siehe auch: Classes, Constructors, OOP