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:

  1. Es wird ein neues JButton Objekt mit der Aufschrift 'Klick doch' erzeugt.
  2. die Referenz (Speicheradresse) des neuen Objekts wird in b gespeichert und ersetzt die bisher dort gespeicherte Adresse.
Wir haben jetzt ein Speicherleck (memory leak), denn Der Button "Klick doch" ist jetzt für unser Programm nicht mehr erreichbar, da wir keine Variable mehr haben, die ihn referenziert. Der Button 'Klick doch' wurde dereferenziert

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


Lehrvideo  (YouTube)