Variablen Initialisierung einer Variablen

konoha

Bekanntes Mitglied
Für folgendes Programm (Screenshot) soll ich angeben welche Variablen erzeugt bzw. Gelöscht werden.

Mein Ansatz:
Im Programm selbst nehme ich keine Variable wahr dessen Wert gelöscht wird.

Die Variablen: test, i und j werden chronologisch erzeugt.

Dann folgt die methode m2 dessen Parameter definiert ist jedoch noch kein Wert überwiesen worden ist. Was ja in der Main Methode mit der 7 geschieht. Hier bin ich mir unsicher. Wird die Variable "parameter" erzeugt sobald die Methode aufgerufen und ihr ein wert übergeben worden ist oder wird sie bereits bei der Erzeugung der Methode m2 erzeugt?

In der main methode wird die variablen a und b chronologisch erzeugt.

Werden die variablen in den methoden m1 bzw. m2, erst mit aufruf der methode erzeugt?

Sind meine Annahmen richtig? Wäre jemand so lieb sie zu überprufen und zu korrigieren?

Ich danke euch im voraus!
 

Anhänge

  • rps20151028_191432.jpg
    rps20151028_191432.jpg
    205,9 KB · Aufrufe: 39

Joose

Top Contributor
Mit "erzeugen" ist in diesen Fall gemeint: Wann wird für diese oder jene Variable Platz im Speicher reserviert. Wann wird dieser wieder freigegeben (gelöscht).

Dabei kommt es nicht darauf an in welcher Reihenfolge deine Methoden in der Datei stehen, sondern in welcher Reihenfolge diese aufgerufen werden.
 

konoha

Bekanntes Mitglied
Danke für deine Rückmeldung. Gehe ich also dann recht in der annahme das:

Zuerst für die variablen in der main methode speicher reserviert wird? Und dann beim aufruf wieder freigegeben wird, während dann beim folgenden aufruf der methode m1() nun speicher für die variablen test, i und j reserviert und nachdem darauffolgenden aufruf der methode m2() wieder freigeben wird? Schließlich wird am ende speicher für die variable parameter reserviert die sich im methodenkopf befindet.

Anschließend wird sie nach ablauf des programms freigegeben?

Habe ich das richtig verstanden?


- variablen in main methode erzeugt
- aufruf der methode m1
- variablen in main methode geloescht
- variablen in m1 erzeugt
- aufruf der methode m2
- variablen in m1 geloescht
- variablen in methode m2 erzeugt
- variablen in methode m2 geloescht
 

Joose

Top Contributor
Schon besser aber noch nicht ganz richtig.
Mit deiner Annahme könntest du in der main-Methode die Variablen "a" bzw. "b" nach dem Aufruf deiner Methoden nicht mehr verwenden bzw. wäre deren Werte weg.

Eine lokale Variable bleibt solange erhalten, solange man sich im selben Scope (oder einem darunter befindet).

Beispiel:
Java:
public static void m1(int param1) {
    int a = 1;
    {
        int x = 2;
        {
            int c = a + x;
        }
    }
    {
        int x = 3;
    }
    double b = 0.0;
}

Die Methode selbst bildet einen Scope (Sichtbarkeitsbereich). In diesem Scope darf jede Variable nur 1x deklariert werden. Und solange man sich innerhalb diese Scope befindet existieren auch alle bis dahin deklarierten Variablen.

Mittels "{ ... }" kann man innerhalb einer Methode einen neuen Scope erzeugen. Innerhalb diesen sind auch alle Variablen von außen bekannt. Sobald dieser Scope verlassen wird ("}") werden auch die Variablen nicht mehr gebraucht.
 

konoha

Bekanntes Mitglied
Befindet man sich also somit beim aufruf einer methode wie m1 in der main methode immer noch im scope bereich? Bleiben also alle variablen der main methode erhalten sowie die variablen der methode m1 und m2, bis der "scope der main methode beendet ist"?

Oder bleiben nur die variablen der main methode erhalten bis nach dem aufruf der methoden m1,2? Und die methoden (lokalen variablen sowie parameter) werden noch vor der lokalen variablen der main methode geloescht?
 

konoha

Bekanntes Mitglied
Wenn die letztere antwort eine ergaenzung zu meiner frage sein soll,
dann würde ich sagen, dass alle variablen der methoden m1 und m2 gelöscht werden. Der parameter der methode m2 und die lokalen variablen der main methode bis kurz vor dem ende ( schliessung der scope) erhalten bleiben. Und anschließend werden sie geloescht.

Folgerung richtig?
 

Joose

Top Contributor
Nein es sollte die Antwort sein ;) -> deine 2.Schlussfolgerung stimmt
Sobald du eine Methode verlässt sind deren lokalen Variablen und Parameter (das habe ich oben vergessen zu schreiben) nicht mehr vorhanden. Der Parameter ist nur eine Kopie des übergebenen Wertes.

Ein wichtiger Punkt gehört noch erwähnt: Diese Aussage trifft natürlich nur zu bei Objekten der Klasse String, sowie primitiven Datentypen. Solltest du als Parameter bzw. lokale Variable Objekte von Klassen verwenden dann werden diese nur aus dem Speicher gelöscht wenn keine Referenz mehr auf diese Objekte besteht.
 

Neue Themen


Oben