Johannes: Objekt löscht sich selbst

Moin,
ich habe ein großes Problem und ich hoffe, dass mir hier jemand helfen kann.

Da mein Problem in Wirklichkeit komplexer ist, stelle ich hier das ganze stark vereinfacht dar.

Im Prinzip möchte ich in einer Methode eines Objekts das Objekt selbst löschen. Ich habe genauer gesagt eine verkettete Liste, die Objektvariablen zu Threads speichert. Nun kann in einem Thread etwas schieflaufen und dann soll sich der Thread selbst beenden (die while(true)-Schleife wird einfach mit break beendet). Danach soll aber auch, und das ist das Entscheidende, der Eintrag in der verketteten Liste gelöscht werden. Wohlgemerkt von dem zu löschenden Thread-Objekt aus.

Ist das überhaupt möglich? Ich habe dazu ein Testprogramm geschrieben: (entschuldigt die einfallslosen Variablennamen).

import java.io.*;
class Test
{
    Blubb test;
    class Blubb {
      public Blubb() {
        test = null;
        if (test == null) {
          System.out.println("Null");
        }
        else {
          System.out.println("Objekt");
        }
      }
    }
    public Test() {
      test = new Blubb();
    }

public static void main( String args[] ) throws IOException {
    Test s = new Test();
    if (s.test == null) {
      System.out.println("Null");
    }
    else {
      System.out.println("Objekt");
    }

}
}

Hier wird einfach ein Objekt s erstellt. Dieses enthält wiederum ein Objekt test. Bei der erstellung dieses Objekts wird die Variable test gleich wieder auf null gesetzt. Eigentlich sollte das Objekt also schon demnächst wieder dem Garbage Collector zum Opfer fallen. Sicherheitshalber frage ich gleich danach nochmal nach, ob test auch wirklich null ist. Ist es auch.

Ok, also zusammengefasst, Objekt wurde erstellt, die Variable hingegen wieder auf null gesetzt. Jetzt frage ich nach dem ganzen wieder in static void main, ob test immernoch null ist, und es ist es NICHT!

Was geht hier vor? Ich sage gleich, dass ich Anfänger bin und es gut sein kann, dass ich das System noch nicht ganz geblickt habe. Deshalb brauche ich dringend eure Hilfe.

Gruß
Johannes

  1. Hallo,

    import java.io.*;
    class Test
    {
        Blubb test;
        class Blubb {
          public Blubb() {
            test = null;

    Hier setzt du zwar "test" auf null. Aber das ist es zu diesem Zeitpunkt
    ohnehin noch, da du bis zu dieser Code-Zeile noch nirgends eine
    Zuweisung _fertig_ durchgeführt hast.

    if (test == null) {
              System.out.println("Null");
            }
            else {
              System.out.println("Objekt");
            }
          }
        }

    Beachte die Reihenfolge.

    public Test() {
          test = new Blubb();
        }

    Zuerst wird "new Blubb()" ausgeführt, was einen Aufruf des Konstruktor
    von "Blubb" nach sich zieht. Erst _nachdem_ der Konstruktor
    zurückgekehrt ist, wird das neu erzeugte Objekt der Variable "test"
    zugewiesen.

    Es ist also alles so, wie's sein soll. :-)

    Gruß
    Slyh

    1. Moin,
      ah ja, ich verstehe. Also wäre es im Prinzip möglich, dass sich ein Objekt selbst löscht? Bzw. die letzte variable auf Null setzt?

      Gruß
      Johannes

      1. ah ja, ich verstehe. Also wäre es im Prinzip möglich, dass sich ein Objekt selbst löscht? Bzw. die letzte variable auf Null setzt?

        Du löschst ja kein Objekt, sondern killst nur eine Referenz auf ein Objekt. Wenn es keine Referenzen auf ein Objekt mehr gibt, bzw. nur noch unreferenzierte Objekt ein Objekt referenzieren (Objektinseln nennt man sowas), dann kommt vielleicht der Garbage-Collector vorbei und killt das Objekt.