Vorlesung Informatik 1 - Teil A: Java Kurs
2.7 Objekt und Referenz
Variablen von elementaren Datentypen (int, double, boolean) speichern ihre Werte direkt .
Variablen vom Typ einer Klasse enthalten in Java nicht das Objekt, sondern sie zeigen auf das Objekt, d.h sie enthalten die Referenz auf das Objekt. In der Praxis ist das die Adresse im Hauptspeicher, an der das Objekt liegt.
Deshalb nennt man Klassen auch Referenzdatentypen.
Wenn eine Variable neu angelegt wird, enthält sie zunächst den speziellen Wert null, d.h. sie zeigt auf kein Objekt.
JButton b; // hat den Wert null
Wenn dann ein Objekt erzeugt wird, kann seine Adresse in b gespeichert werden:
b = new JButton("Klick mal"); // b referenziert jetzt ein JButton Objekt mit der Aufschrift 'Klick mal'
Im Hauptspeicher stellt sich das so dar:
Adresse Inhalt Variable | | 4711 | | b 4712 | 9870 | ... 9870 | hier | | steht | | das | | JButton | | Objekt |
Variablen vom Typ einer Klasse sind immer genau 4 Byte groß und enthalten entweder null oder die Adresse (Referenz) auf ein Objekt dieser Klasse.
Wenn wir schreiben:
JButton b2 = b; // hier wird kein
Objekt kopiert, sondern nur die Referenz (4Byte)
erzeugen wir kein neues
Objekt, sondern eine zweite Variable, die auch die Adresse 9780 enthält!
Es gibt jetzt also zwei
Referenzen (b und b2), die auf das gleiche Objekt zeigen.
Die Anweisung:
b = new JButton("Klick nicht");
erzeugt ein neues
Objekt, auf das b jetzt zeigt. Wir haben jetzt also zwei Objekte, die von den Variablen b und b2 referentziert
werden.
Verwaiste Objekte (Speicherlecks)
Die Anweisung
b = new JButton("Klick doch");
bewirkt
folgendes:
- Es wird ein neues JButton Objekt mit der Aufschrift 'Klick doch' erzeugt.
- die Referenz (Speicheradresse) des neuen Objekts wird in b gespeichert und ersetzt die bisher dort gespeicherte Adresse.
In vielen Programmiersprachen sind Speicherlecks gefürchtet, da sie schwer zu finden sind. Photoshop hatte über mehrere Versionen ein memory-leak: wenn man mehrfach hintereinander Bilder geöffnet und wieder geschlossen hat, brach das Programm mit "out of memory" hart ab.
In Java hat man einen Mechanismus implementiert, der automatisch Speicherlecks sucht und entfernt. Er heißt passenderweise "Garbage Collector".
Wie alles im Leben hat auch dieses praktische Teil seinen Preis: er beginnt ohne Vorwarnung zu arbeiten wenn der Speicher voll wird, baucht aber erhebliche CPU Ressourcen. Für die Steuerung von Flugzeugen oder Beatmungsgeräten ist Java deshalb nicht geeignet, weil die Software evtl. plötzlich nicht mehr nachkommt, wenn der Garbage Collector die halbe CPU-Power wegnimmt.
Weiterführende Links
Referenzen in Java ist auch eine Insel