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:
[code=Java]public class Test {
private int zahl1;
public Test(int zahl2) {
zahl2 = zahl2;
}
}[/code]
(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:
[code=Java]int zahl1;
public void int setZahl1(int zahl1){
this.zahl1 = zahl1;
}[/code]
Gruß
Edit: Als ich angefangen habe zu schreiben war der Thread noch leer 