# Variablen überschreiben



## julchen81 (20. Okt 2011)

Hallo, 

ich weiß, wie ich das Problem umgehen kann, aber ich würde gerne wissen, wieso folgendes nicht funktioniert:


```
public class Test {
    private int zahl;
    public Test(int zahl) {
        zahl = zahl;
    }
}
```

wenn ich ein Objekt der Klasse erzeuge und beim Erzeugen eine Zahl z.B. 5 angebe, dann bleibt der Wert von zahl trotzdem gleich 0.

Wieso genau? Was läuft schrittweise ab?

Viele Grüße und schon mal danke für jede Hilfe!
Julia


----------



## Tomate_Salat (20. Okt 2011)

weil du hier den Parameter zahl editierst. Woher sollte Java auch wissen, dass du die Variable zahl der Klasse Test meinst. Aber dafür gibt es eine einfache Lösung:

```
this.zahl=zahl;
```


----------



## Gast2 (20. Okt 2011)

```
zahl = zahl;
```
Woher soll Java wissen, dass du mit dem linken 
	
	
	
	





```
zahl
```
 deine Klassenvariable meinst und mit der rechte 
	
	
	
	





```
zahl
```
 den Wert des Konstruktors?
Java nimmt immer die Variable die den kleinsten Scope hat, das ist in deinem Fall die Zahl die nur im Konstruktor gültig ist.
Du musst schreiben:

```
this.zahl = zahl;
```


```
this.zahl
```
 bezieht sich auf die Klassenvariable

```
zahl
```
 ist weiterhin der Wert der im Konstruktor übergeben wird.


----------



## darekkay (20. Okt 2011)

Du hast zwei Variablen mit dem selben namen. Im Test-Konstruktor wird deswegen die Variable genommen, die als Parameter übergeben wurde. Sprich, du weist dem Paramter den Parameter zu (Eclipse würde dir dies unterstreichen).

Die richtige Lösung "this.zahl = zahl" scheinst du ja schon zu kennen.


----------



## Firephoenix (20. Okt 2011)

Beschäftige dich dazu einmal mit den Begriffen Shadowing und Scoping.

Eine Variable gilt für den Klammernblock in dem sie deklariert wurde.
Hast du in diesem Klammernblock einen weiteren Klammernblock und deklarierst darin eine Variable die genauso heißt wie die im äußeren, dann überlagert die innere Variable die äußere.

Genau genommen machst du in deinem Programm damit nichts anderes als:


```
public class Test {
    private int zahl1;
    public Test(int zahl2) {
        zahl2 = zahl2;
    }
}
```

(ich habe nur die Namen geändert, der Effekt ist der gleiche).

Um aber trotzdem auf die Variable zahl1 (bzw zahl in deinem Beispiel) zugreifen zu können, kannst du das keyword "this" benutzen, dieses bezieht sich auf die aktuelle Klasseninstanz und mit this.zahl1 weiß der compiler, dass du das feld zahl1 der aktuellen klasseninstanz meinst die du gerade erzeugst.
nach dem gleichen schema kannst du auch setter bauen:

```
int zahl1;
public void int setZahl1(int zahl1){
    this.zahl1 = zahl1;
}
```
Gruß

Edit: Als ich angefangen habe zu schreiben war der Thread noch leer


----------



## julchen81 (20. Okt 2011)

Danke!! Hammer, so schnell so viele Antworten!!

Dickes Danke an alle  und danke Firephoenix für diese besonders ausführliche Antwort 

Logisch... Groschen ist gefallen.

Julia


----------



## Kahnbein.Kai2 (7. Sep 2018)

Guten Tag,
ich würde das kleine Programm gerne einmal Test, allerdings bekomme ich es nicht zum laufen. 
Ist jemand so nett und kann den kompletten Quelltext mit Startpunkt hier einstellen ? 

Danke und ein schönes Wochenende
Kai


----------



## Robat (7. Sep 2018)

Der Thread ist 7 Jahre alt, ich glaube nicht, dass hier von den ursprünglichen noch jemand antwortet 
Mach am Besten nächstes mal einen eigenen Thread auf.

Das Programm wird wohl irgendwie so ausgesehen haben:

```
public class Test {
    private int zahl;
    public Test(int zahl) {
        this.zahl = zahl;
    }

    public static void main(String[] args) {
         Test test = new Test(2);
         System.out.println(test.zahl);
    }
}
```


----------



## Kahnbein.Kai2 (7. Sep 2018)

Danke Robat,
ich werde es versuche ! 
Ok, mache ich beim nächsten mal !


----------



## MoxxiManagarm (7. Sep 2018)

Robat hat gesagt.:


> Der Thread ist 7 Jahre alt, ich glaube nicht, dass hier von den ursprünglichen noch jemand antwortet
> Mach am Besten nächstes mal einen eigenen Thread auf.
> 
> Das Programm wird wohl irgendwie so ausgesehen haben:
> ...


Der Code wird nicht funktionieren.


```
public class Test {
    private int zahl;

    public Test(int zahl) {
        this.zahl = zahl;
    }

    public int getZahl() {
        return zahl;
    }

    public static void main(String[] args) {
         Test test = new Test(2);
         System.out.println(test.getZahl());
    }
}
```

Oder Zahl public machen aber wir sollten das Geheimnisprinzip wahren


----------



## Robat (7. Sep 2018)

MoxxiManagarm hat gesagt.:


> Der Code wird nicht funktionieren.


Wieso die main-Methode steht doch in der Test-Klasse .. warum sollte man da nicht auf `test.zahl` zugreifen dürfen?



MoxxiManagarm hat gesagt.:


> aber wir sollten das Geheimnisprinzip wahren


Das seh ich auch so. Ich würde auch immer Setter/Getter anlegen aber das wurde im Ausgangspost eben auch nicht (offensichtlich) gemacht


----------



## Xyz1 (7. Sep 2018)

MoxxiManagarm hat gesagt.:


> Der Code wird nicht funktionieren.


@MoxxiManagarm
Die zahl ist doch in derselben Klasse....

Doch, das geht schon aber dann nicht innerhalb von Test nicht sichtbar.

Originalbeitrag:


julchen81 hat gesagt.:


> zahl = zahl;


DAS wird natürlich dick rot unterkringelt werden.... 

Aaber, 15 Jahre her


----------



## mrBrown (7. Sep 2018)

DerWissende hat gesagt.:


> Originalbeitrag:
> 
> DAS wird natürlich dick rot unterkringelt werden....



Von wem sollte das dick rot unterkringelt werden?


----------



## Xyz1 (7. Sep 2018)

mrBrown hat gesagt.:


> Von wem sollte das dick rot unterkringelt werden?


Nun ja


> Assignment To Itself
> ----
> (Alt-Enter shows hints)



For 5 Jahren kann es aber auch anders gewesen sein


----------



## mrBrown (8. Sep 2018)

DerWissende hat gesagt.:


> Nun ja
> 
> 
> For 5 Jahren kann es aber auch anders gewesen sein


Schön, dass es in irgendeiner von dir benutzen IDE rot unterkringelt ist 
In den meisten wird's anders aussehen und der Compiler meckert nicht drüber...


----------



## Xyz1 (8. Sep 2018)

mrBrown hat gesagt.:


> In den meisten wird's anders aussehen


Auch eclipse und Intelli wirds unterkringeln.


----------



## thecain (8. Sep 2018)

rot? weil darum gings ja


----------



## Xyz1 (8. Sep 2018)

thecain hat gesagt.:


> rot?


mittleres Gelb.


----------

