Variablen überschreiben

julchen81

Bekanntes Mitglied
Hallo,

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

Java:
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
 
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:
Java:
this.zahl=zahl;
 
Java:
zahl = zahl;
Woher soll Java wissen, dass du mit dem linken
Code:
zahl
deine Klassenvariable meinst und mit der rechte
Code:
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:
Java:
this.zahl = zahl;
Code:
this.zahl
bezieht sich auf die Klassenvariable
Code:
zahl
ist weiterhin der Wert der im Konstruktor übergeben wird.
 
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.
 
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:

Java:
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:
Java:
int zahl1;
public void int setZahl1(int zahl1){
    this.zahl1 = zahl1;
}
Gruß

Edit: Als ich angefangen habe zu schreiben war der Thread noch leer 😛
 
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
 
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
 
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:
Java:
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);
    }
}
 
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:
Java:
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);
    }
}
Der Code wird nicht funktionieren.

Java:
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 😎
 

Neue Themen


Zurück
Oben