# Überdecken von Attributen und Sichtbarkeit von Variablen



## chillipalmer (18. Mrz 2009)

Hi!

Im folgenden Quelltext sollen für jede Variable mit dem Bezeichner a die Zeilen markiert werden in denen sie sichtbar ist. Ich weiß allerdings nicht genau wie das gemeint ist. Ist a in der Class Ueberdecken nicht über all sichtbar, weil sie als static deklariert ist? Kann mir jemand von euch sagen wo a sichtbar ist, oder woran ich erkenne wo sie sichtbar ist?

[HIGHLIGHT="Java"]
class Ueberdecken {

  static int a = 7;

  static void methode1() {
    System.out.println("Methode 1");
    System.out.println("a=" + a);
    int a = 10;
    System.out.println("a=" + a);
  }

  static void methode2(int a) {
    System.out.println("Methode 2");
    System.out.println("a=" + a);
    a = a + 2;
    System.out.println("a=" + a);
  }

  static int methode3() {
    System.out.println("Methode 3");
    System.out.println("a=" + a);
    a++;
    if (a > 7) {
      int a = 3;
      System.out.println("a=" + a);
    }
    System.out.println("a=" + a);

    return a;
  }

  public static void main(String[] args) {
    methode1();
    methode2(a);
    a = 1 + methode3();
    System.out.println("a=" + a);
  }
}

[/HIGHLIGHT]


----------



## 0x7F800000 (18. Mrz 2009)

chillipalmer hat gesagt.:


> Ist a in der Class Ueberdecken nicht über all sichtbar, weil sie als static deklariert ist?


klar ist sie das, aber manchmal müsste man Ueberdecken.a schreiben, um an das statische a zu kommen. Ich würde einfach jedem der hier vorkommenden a's eine farbe bzw nummer zuordnen, den code zeile für zeile durchgehen, und jeweils überlegen, welches a gemeint ist, wenn man da einfach "a" hinschreibt.


----------



## hdi (18. Mrz 2009)

Also gefragt ist ja nach dem statischen a.

In methode1: sichtbar bis zur zeile int a = 10;
in methode2: gar nicht sichtbar
in methode3: überall ausser *innerhalb* des if-Rumpfes
in der main: überall

Generell gilt: Sobald du innerhalb eines Blocks, also {block}, eine Variable
hast die auch "a" heisst, ist in diesem Block das statische a überschattet, 
und nicht mehr erreichbar, ausser mit ihrem vollen Namen ("Verdeckung.a")
(Natürlich erst ab der Zeile, wo das a eintritt, nicht automatisch im ganzen Block)


----------



## chillipalmer (18. Mrz 2009)

So, hab das jetzt mal schnell probiert, hoffe ich habs richtig verstanden und richtig angewendet. Ich wusste nur nicht, ob die Variablen in den Methoden in main sichtbar sind und ob z.B. a++ oder a = a+ 2 als neue Variable gilt und bei a++ dann in der gleichen Zeile noch die alte sichtbar ist, bin aber mal davon ausgegangen. 
Wäre nett, wenn du oder ein anderer da mal drüberschauen könnten, müsst ja nicht alles genau kontrollieren, nur kurz sagen, ob das vom Prinzip her stimmt.

[HIGHLIGHT="Java"]
class Ueberdecken {

  static int a = 7;  // sichtbar in Zeile 3, 7, 12, 14, 15, 21, 22(?), 33, 34, 35

  static void methode1() {
    System.out.println("Methode 1");
    System.out.println("a=" + a);
    int a = 10;                                 // sichtbar in Zeile 8, 9, 33
    System.out.println("a=" + a);
  }

  static void methode2(int a) {
    System.out.println("Methode 2");
    System.out.println("a=" + a);
    a = a + 2;                                // sichtbar in Zeile 15, 16, 34
    System.out.println("a=" + a);
  }

  static int methode3() {
    System.out.println("Methode 3");
    System.out.println("a=" + a);
    a++;                                        // sichtbar in Zeile 22, 23, 27, 29
    if (a > 7) {
      int a = 3;                                // sichtbar in Zeile 24, 25, 35
      System.out.println("a=" + a);
    }
    System.out.println("a=" + a);

    return a;
  }

  public static void main(String[] args) {
    methode1();
    methode2(a);
    a = 1 + methode3();               // sichtbar in Zeile 35, 36
    System.out.println("a=" + a);
  }
}

[/HIGHLIGHT]


----------



## chillipalmer (18. Mrz 2009)

hdi hat gesagt.:


> Also gefragt ist ja nach dem statischen a.
> 
> In methode1: sichtbar bis zur zeile int a = 10;
> in methode2: gar nicht sichtbar
> ...



Aso, dann war das was ich grade gepostet habe ja mal Müll.


----------



## chillipalmer (18. Mrz 2009)

hdi hat gesagt.:


> in methode2: gar nicht sichtbar



Warum ist es denn hier gar nicht sichtbar?? Es wird ja das statische a ausgegeben...


[HIGHLIGHT="Java"]
Methode 1
a=7
a=10
Methode 2
a=7
a=9
Methode 3
a=7
a=3
a=8
a=9

[/HIGHLIGHT]


----------



## musiKk (18. Mrz 2009)

Ja ne. In methode2 wird das "statische a" ja in der main als Parameter übergeben. Darum siehst du es dort quasi. Es ist aber nicht das gleiche a, sondern nur eine Variable, die zufällig auch a heißt. Das kannst du dadurch probieren, dass du in methode2 das a überall durch einen anderen Buchstaben ersetzt. Die Werte bleiben die gleichen.

Wenn du mit den Werten rechnest, wird nichts überdeckt. Das passiert nur bei einer Neudeklaration und die erkennst du daran, dass als erstes in der Zeile ein Typ steht (in diesem Falle int). In den Zeilen 15 und 22 ist das nicht der Fall.


----------



## hdi (18. Mrz 2009)

nein es wird das lokale a ausgegeben. aber da du die methode mit dem wert 
des statischen a aufrufst, hat das lokale a eben den gleichen Wert.
Wenn du allerdings nach dem Aufruf der methode2() überprüfst, was das statische
a ist (in der main-methode), wirst du sehen dass sich nix am wert geändert hat,
weil methode2 nur auf einer lokalen variable arbeitet, die gelöscht wird, sobald die
methode verlassen wird.


----------



## chillipalmer (18. Mrz 2009)

okay, dann hab ichs jetzt wohl verstanden.


----------

