# globale und lokale Variablen



## babuschka (21. Feb 2009)

Hallo Community,
könnt ihr mir vielleicht anhand einer beispiel zeigen wie eine lokale und globale variable aussieht?Kann mir das so leider nicht so ganz vorstellen  Danke im Voraus.


----------



## babuschka (21. Feb 2009)

> public class Main{
> public static void main(String [] args){
> 
> int b=5; (Globale Variable??)
> ...



Habe die mir so vorgestellt.Stimmen die so? Oder sieht das total anderst aus?


----------



## hdi (21. Feb 2009)

Globale Variablen sind alle Variablen, die "lose" im *Klassen*-Rumpf
stehen, und nicht in einer Methode/Konstruktor. "Stehen" ist vllt schlampig gesagt, genauer meint es "deklariert werden".
Alles andere sind lokale Variablen.

Bsp:


```
public class Auto{

   private int ps; // global

   public void eineMethode(){
          int eineLokaleVariable;
   }
}
```

Lokale Variablen haben eine "Lebensspanne" nur innerhalb 
des *Rumpfes*, in dem sie deklariert wurden.
zB gibt es die Variable "eineLokaleVariable" wirklich nur in der Methode
"eineMethode". In einer weiteren Methode könntest du darauf nicht
zugreifen, die Variable "stirbt" sobald die Methode verlassen wird.

Ein "Rumpf" ist alles zwischen einem { und }. Das ist also nicht unbedingt eine ganze Methode:


```
public void andereMethode(){
     int x = 5; // ab hier ist x sichtbar
     if(x == 5){
            String s = "hallo"; // ab hier ist s sichtbar
            System.out.println(s);
     } // ab hier ist s wieder weg
     int y = 2; // ab hier ist y sichtbar
} // ab hier sind x und y wieder weg
```

Gloable Variablen allerdings sind überall in der Klasse sichtbar:
In jeder Methode, sowie im Konstruktor. Sie "sterben" auch erst,
wenn das Objekt zerstört wird. Solange das Objekt aber "lebt"
(ich hoffe du weisst überhaupt was ein "Objekt" ist) gibt es diese
Variable, und ihr Wert bleibt auch solange gleich bis er geändert wird.
Und ist ansonsten immer und überall der selbe, egal wie oft man 
irgendwas mit dem Objekt tut.


----------



## 0x7F800000 (21. Feb 2009)

Einspruch, euer Ehren...

```
private int ps; // "global"?   "private Membervariable" trifft's hier um einiges besser.
```



hdi hat gesagt.:


> Gloable Variablen allerdings sind überall in der Klasse sichtbar


private member vars sind nun mal wirklich nicht überall in der klasse sichtbar... Dein Beispiel ist total irreführend.


Was ich mir in Java unter einer "globalen variable" vorstellen würde, wäre sowas:

```
class Math{
  ...
  public static final double PI=3.2;
  ...
}
```
Die ist wirklich überall dort sichtbar, wo auch die Klasse sichtbar ist, im Fall von Math ist das überall...

"Lokale" Variablen kann man nicht so toll "lokalisieren", weil es grob geschätzt ~2^16 verschiedene Verschachtelungsebenen geben kann. Ich würde eine Member-Variable nicht in diese ganze "lokal-global"-Sprechweisen reinquetschen. Wozu auch, wenn man genau spezifizieren kann, wo die Variable sichtbar ist, dazu gibt's in Java ja zum Glück genug Schlüsselwörter...


----------



## hdi (21. Feb 2009)

> "Lokale" Variablen kann man nicht so toll "lokalisieren"


Wie? Eine lokale Variable existiert innerhalb eines Rumpfes, in der sie
deklariert wurde. Keine Ausnahme, wieso nicht toll lokalisieren? Ist doch total
klar, egal wie krass du das verschachtelst.
Sei wird geboren mit dem { und stirbt mit dem dazugehörigen }.



> private member vars sind nun mal wirklich nicht überall in der klasse sichtbar... Dein Beispiel ist total irreführend.


Das wär mir neu!? Klar sind private Member vars überall in dieser Klasse
sichtbar. Es geht hier nicht um Inner-Classes, es geht um die eigene Klasse.
Und das hat mit statisch oder public auch nix am Hut.

Oder hab ich hier wieder falsche Bezeichnungen gelernt? Global, so lernt ich es,
heisst eben nur, dass die Variable lose in der Klasse steht.
Ob nun Member oder nicht, public oder nicht, hat damit doch nix zu tun.
"Global" ist ein ortsbezogener Ausdruck, der doch nur von der Verfügbarkeit einer Variable redet.
Hier gebe ich dir Recht: Das Wort "sichtbar" hätte ich vllt nicht verwenden sollen, sondern eben "verfügbar", im Sinne
von innerhalb der Klasse sichtbar.

(Bsp, wo eine private member var nicht sichtbar ist in ihrer Klasse?)

EDIT: und komm mir nicht mit Überschatten, das hat nix mit den Definitionen von global/lokal zu tun


----------



## 0x7F800000 (21. Feb 2009)

hdi hat gesagt.:


> Wie? Eine lokale Variable existiert innerhalb eines Rumpfes, in der sie
> deklariert wurde. Keine Ausnahme, wieso nicht toll lokalisieren? Ist doch total
> klar, egal wie krass du das verschachtelst.
> Sei wird geboren mit dem { und stirbt mit dem dazugehörigen }.


Okay, gut, eine lokale Variable lebt seit der Deklaration bis zum Ende des umgebenden Blocks {} das ist schon äußerst genau, ich wollte halt nur drauf hinweisen, dass man das beliebig krass verschachteln kann.


> Das wär mir neu!? Klar sind private Member vars überall in dieser Klasse
> sichtbar.
> ...
> (Bsp, wo eine private member var nicht sichtbar ist in ihrer Klasse?)


Njaain. Das kann man doch so nicht sagen...


```
class A{
   private int x;
   public A(int _x){ x=_x; }
   public void f(A a){
      System.out.println(this.x); //geht
      System.out.println(a.x); //geht natürlich auch, genau das meinst du doch?
   }
}
```
Aber da kann man doch nicht sagen dass die Variable "überall in der Klasse sichtbar" wäre... Wenn ein Objekt vom Typ A (etwa dieses a) von außen an irgendeine Methode der Klasse A übergeben wird, dann gewährt er einen uneigeschränkten Zugriff auf all seine "Innereien", auch auf die Variable x;

Aber jetzt mal folgendes Beispiel:

```
class Blackhole{
   private List<Object> content;
   public Blackhole(){
      content=new LinkedList<Object>();
   }
   public void eat(Object o){
      content.add(o);
   }
   //keinerlei getter...
}
```
und nun zusammen mit der Klasse A:

```
public class Main{
public static void main(String... _){
   Blackhole supermassive=new Blackhole();
   supermassive.eat(new A(123456789));
}
}
```
so, und jetzt sag ich dir, dass mir die höchstgeheime Zahl 123456789 extrem wichtig ist. Du kannst in deiner Klasse A machen was du willst: ohne Reflection-hacks holst du die Zahl 123456789 niemals aus dieser "verschluckten" Instanz raus, obwohl die Instanz wohlauf ist und vom GC nicht eingesammelt wurde, sondern sicher im Blackhole verstaut wird.

Sowas ist doch in keiner Weise "global"... Versuch mal das PI von jemanden so zu verstecken, ohne gleich die ganze Math-Klasse rauszuladen oder sonswas.


----------



## hdi (21. Feb 2009)

Hm okay ich sehe wir haben einfach wieder verschiedene Definitionen gelernt.
Ich meine mit lokal/global nur: Wo kann ich eine Variable innerhalb der eigenen
Klasse, im Sinne vom Quell-Code dieser Klasse, ansprechen?
Wo ist sie "bekannt", wo nicht?

Sprich: Wo kommt ein "cannot find symbol" Fehler innerhalb des Quell-Codes
der Klasse? Bei globalen (nach meiner Definition): Nirgends. Unabhängig
von jeglichen Settings wie final, public, static usw.

Bei lokalen: Überall, wo es ausserhalb der {} im Quell-Code ist.

Was nun wieder die "richtigen" Definitionen sind? Hm.. ich erhebe keinen
Anspruch drauf, dass meine richtig sind. Es ist nur so wie ich es kenne,
das sage ich halt wenn man mich fragt: Was ist der Unterschied zwischen
lokalen/globalen Variablen?
Und das, was ich gesagt habe, will zB die Uni hören, und bringt einem die Uni
bei.


----------



## 0x7F800000 (21. Feb 2009)

hdi hat gesagt.:


> Hm okay ich sehe wir haben einfach wieder verschiedene Definitionen gelernt.
> Ich meine mit lokal/global nur: Wo kann ich eine Variable innerhalb der eigenen
> Klasse, im Sinne vom Quell-Code dieser Klasse, ansprechen?
> Wo ist sie "bekannt", wo nicht?
> ...


Okay. Das wäre doch auch mal eine imho zwar etwas unübliche, aber sinnvolle Definition.

Ich verstehe unter einer "globalen Variable" eine Variable, die überall aus jeder Stelle im Code erreichbar ist, unabhängig von irgendwelchen Klassen oder Methoden (aber zwangsläufig immer anhängig von imports...). Das trifft auf Membervariablen natürlich fast nirgends zu, deswegen hat's in meine Definition nicht gepasst.


----------



## babuschka (21. Feb 2009)

Was nun?  bin durcheinander gekommen

Globale Variable: werden außerhalb einer Methode definiert und stehen im ganzen Programm für alle Blöcke zur Verfügung.

Lokale Variable: werden innerhalb einer Methode definiert oder als Parameter übergeben. Sie sind innerhalb der {} Klammern gültig.

Stimmen die definitionen?

Ist es also nicht:



> public class Main {
> int zahl=4;  // Lokale da es außerhalb einer Methode definiert wird
> 
> public static void main(String[] args) {
> ...


----------



## Fu3L (21. Feb 2009)

FBI_1907 hat gesagt.:


> Was nun?  bin durcheinander gekommen
> 
> Globale Variable: werden außerhalb einer Methode definiert und stehen im ganzen Programm für alle Blöcke zur Verfügung.
> 
> ...



Da haste dich, glaub ich, verschrieben: zahl is nach hdi's Definition natürlich "global". Eine Membervariable von Main...


----------



## babuschka (21. Feb 2009)

Fu3L hat gesagt.:


> Da haste dich, glaub ich, verschrieben: zahl is nach hdi's Definition natürlich "global". Eine Membervariable von Main...




also dann genau umgekehrt?

int g=3 ist lokal  und int zahl=4 ist global?


----------



## Fu3L (21. Feb 2009)

FBI_1907 hat gesagt.:


> also dann genau umgekehrt?
> 
> 3 ist lokal 4 ist global?



g (3) ist lokal, weils innerhalb einer Methode definiert wurde und dort, und zwar *nur dort*, komplett gültig.

zahl (4) ist eine Membervariable von Main und daher aus allen nicht-statischen Methoden von Main erreichbar (also nach hdi's Definition "global").

Edit: Also Antwort auf die Frage: Ja


----------



## Spacerat (21. Feb 2009)

Wenn man's weniger "schlampig" ;-) ausdrücken möchte...

Eine Variable ist "global", wenn sie mit "private", "public" usw. modifiziert werden kann, was nur innerhalb von Klassen-Definitions-Blöcken, ausserhalb von Methoden funktioniert. Lokale Variablen existieren dagegen nur in Anweisungs-Blöcken wie Methoden-Rümpfe, try / catch Blöcken und Schleifen.

"private int sonstwas" ist demnach auch global, jedoch stark in der Sichtbarkeit eingeschränkt.

Der einzige Modifizierer, der auf lokale Variablen angewendet werden kann ist "final"


----------



## hdi (21. Feb 2009)

synchronized?

Ist nicht getestet aber ich überleg mir ich starte innerhalb einer Methode
2 Threads (inner classes!) zum Hochzählen einer lokalen Variable. 
Geht das nicht? final sychronzied?

edit: ok saudaummes beispiel


----------



## Spacerat (21. Feb 2009)

ist synchronized 1. ein Modifier, oder 2. mehr 'ne Anweisung einen Monitor zu "aquirieren"? Sicher bin ich mir nicht, aber ich tippe mal auf 2.


----------



## Schandro (21. Feb 2009)

Ist ein Modifier...


----------



## Marco13 (21. Feb 2009)

Ich finde ja, dass es "globale" Variablen in Java nicht gibt. Eine Variable ist immer an eine Klasse oder eine Instanz gebunden. Wie und wo man sie sieht, hat damit IMHO nichts zu tun. Ist aber nur meine subjektive Sicht.

Synchronized ist zwar einerseits ein modifier, andererseits kann man auch schreiben

```
void foo()
{
    synchronized (bar)  { ... }
}
```
und DORT ist es sicher KEIN Modifier.... Das allgemeinste, was mir einfallen würde: Synchronized ist ein "Schlüsselwort"....


----------



## hdi (21. Feb 2009)

Bevor es wieder losgeht kann ja einer in die JLS kucken.
Stichwort global/lokal und synchronized/modifier.

Aber ich geb mir das sicherlich nich


----------

