Vorlesung Informatik 2 - Teil A: Java Kurs

2.1 Lokale Variablen

Für das Verständnis von Rekursion sind die folgenden Konzepte hilfreich:

  • Lokale Variablen einer Methode werden erst beim Aufruf einer Methode im Speicher angelegt.
  • Alle Parameter einer Methode werden in lokale Variablen kopiert, d.h. eine Methode kann die Original-Werte  der Parameter im rufenden Programm nicht verändern.
  • Zur Verwaltung der lokalen Variablen verwendet das Betriebssystem eine Stack.

Beispiel:

void main(String[] args){
     double  p = polynom(5,7,9,3);
}
static double polynom(double x, double a, double b, double c){
    double wert = produkt(a,x*x) + produkt(b,x) + c;
    return wert;
}
static double produkt(double s, double t){
    return s*t;
}

Die Variablen args und p sind lokale Variablen von main, x, a, b, c und wert sind lokale Variablen von polynom, s und t sind lokale Variablen von produkt.

Diese Variablen werden erst im Speicher angelegt, wenn die Methoden aufgerufen (aktiviert) werden. Vorteil: nur die lokalen Variablen der gerade aktiven Methoden verbrauchen Hauptspeicher.

Zur Verwaltung der lokalen Variablen legt das Betriebssystem bzw. die JVM für jeden Prozess einen Stack (Stapel) an. Die Elemente eines Stack werden aufeinandergestapelt, wie Teller im Schrank. Für jede gerufene Methode wird ein neues Element (Stack-Frame) angelegt, das im Wesentlichen die Rücksprungadresse zum rufenden Programm sowie die lokalen Variablen enthält. 

Der Stack im obigen Beispiel sieht dann wie folgt aus:

 App gestartet        Aufruf von polynom        erster Aufruf von 
   (nur main)                                       produkt
                                              |-------------------|
                                              |    produkt:       |
                                              |     s(7), t(25)   |
                     |-------------------|    |-------------------|
                     |    polynom:       |    |    Polynom:       |
                     | x(5), a(7), b(9)  |    | x(5), a(7), b(9)  |
| c(3), wert(223) | | c(3), wert(223) | |-------------| |-------------------| |-------------------| | main: | | main: | | main: | | args,p | | args,p | | args,p | |-------------| |-------------------| |-------------------| /////////////// ///////////////////// /////////////////////

Wenn also eine Methode einen Parameter ändert, ist nur die Kopie im Stack betroffen und nicht der Original-Wert in der rufenden Methode!

Jedes Mal, wenn eine Methode mit return zum rufenden Programm zurückkehrt, wird der oberste Stack-Frame entfernt.

Lehrvideo  (YouTube)