[Java] verständnisfragen

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von ChiN, 29. November 2009 .

Schlagworte:
  1. 29. November 2009
    verständnisfragen

    wie die Titel schon sagt geht es hier um allgemeine Fragen die ich habe zum Thema java habe.
    Meist sind es allgemeine Fraggen ob ich einen Sachverhalt richtig verstehe.
    Ich werde meinen Text immer wieder editieren sofern neue Fragen auftreten.

    Beispiel 1
    Angenommen ich habe die Klasse Mensch erstellt mit einigen attributen.

    nun möchte ich ein Objekt daraus schnitzen
    Code:
    new Mensch();
    Mensch p;
    p = new Mensch();
    ich habe ein Objekt der Klasse Mensch erstellt.
    Dann eine Variable vom Typ Mensch mit dem namen p erstellt.
    Dann eine referenz des neuen Objektes p mitgeteilt.




    Danke für eure Hilfe.
    Sollten meine Angaben die ich gemacht habe reicht ein richitig. oder ein
     
  2. 29. November 2009
    AW: verständnisfragen

    falsch...

    new Mensch(); erstellt ein neues objekt, welches direkt wieder vom garbage collector gekillt wird weils in keiner variable gespeichert wird.

    erst da wo du p = new Mensch() machst wird wieder ein neues objekt erstellt und in die variable p gespeichert.

    mfg
     
  3. 29. November 2009
    AW: verständnisfragen

    ich dachte in p wird nur ein verweis auf das objekt gespeichert
     
  4. 29. November 2009
    AW: verständnisfragen

    nein.

    Nur wenn du folgendes machst:

    Mensch p, c;

    p = new Mensch();
    c = p;

    dann ist c eine Referenz auf die Instanz die auch p innehat.

    new Mensch(); erstellt praktisch wie schon gesagt nur eine Instanz auf die es keine Referenzen gibt. Referenzlose Instanzen von Objekten werden vom Garbagecollector eliminiert.
     
  5. 29. November 2009
    AW: verständnisfragen

    ja natürlich.
    Aber der Garbage Collector von Java erkennt, wann Speicher bereinigt werden kann.
    In manch andren Sprachen muss man das selbst erledigen.

    Also ich veranschauliche es mal Bildlich
    [][][][][][][][][][][][][][][][][]
    so das is der Arbeitsspeicher den du für dein Programm zu Verfügung hast. nun führen wir mal deinen code aus
    new Mensch()
    [Mensch][][][][][][][][][][][][][][][][]
    so das steht jetzt ein Objekt von Typ Mensch drinne drinn
    nun
    Mensch p
    [][][][][][][][p=null][][][][][][][][][]
    so jetzt wurde das Objekt wieder gelöscht, weil du es net mehr nutzt, dass hat der Garbage Collector erkannt. Es wurde eine Variable p erzeugt, die erstmal auf null zeigt
    p=new Mensch;
    [][][][][][][][p=Mensch][][][][][][][][][]
    nun wurde ein objekt vom typmensch erzeugt
    Da zeigt nun p drauf

    Das ist zwar net hundert prozentig so
    aber ungefähr...
     
  6. 29. November 2009
    AW: verständnisfragen

    Ist richtig.

    Es gibt 2 verschiedene Speicher: Den Heap und den Stack.

    in deinem Fall:

    New Mensch(); -> erstellt ein Objekt im Heap, welches frei rumschwirrt und vom GC gelöscht wird (wie mein Vorvorvorvorposter schon richtig sagte)

    Mensch p; -> erstellt eine Variable im Stack vom Typ Mensch.

    p = new Mensch(); -> erstellt ein Objekt von Typ Mensch im Heap und p referenziert aus dem Stack auf das neu erstellte Objekt im Heap.

    //edit: mein Vorvorposter sagt jetzt zwar was anderes, aber ich bin mir fast sicher dass das so ist wie ich gesagt habe^^
     
  7. 29. November 2009
    AW: verständnisfragen

    Das ist auch richtig.
    Eine Variable speichert immer eine Referenz auf ein Objekt.

    Allerdings gibt es in Java die angesprochene GarbageCollection. Diese sorgt dafür, dass nicht mehr referenzierte Objekte gelöscht werden.

    new Mensch(); => Objekt wird erstellt, Programm enthält keine Referenz auf dieses Objekt => Objekt wird von der GarbageCollection gelöscht.

    Mensch p = new Mensch(); Erzeugt ein Objekt und legt die Referenz in p ab (das Objekt kann bentuzt werden)

    Rein von der Logik: das obere Objekt könnteste du im Programm ohnehin nicht ansprechen, weil du die Referenz nicht abgelegt hast.

    edit: wow, hier posten ja jetzt alle auf einmal
     
  8. 29. November 2009
    AW: verständnisfragen

    ne das is bei c++ zB so, aber bei java werden objekte nur mit new erstellt.
    aufm stack landen zB lokale variablen, die halt am ende der methode nicht mehr wichtig sind, aber trotzdem muss man die objekte normal initialisieren. bei c++ ist es so, dass man wenn man new benutzt, objekte auf dem heap erstellt und wenn nicht, die aufm stack landen.
     
  9. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.