Variablen überschreiben innerhalb einer Klasse

julchen81

Bekanntes Mitglied
Hallo!

folgendes Programm nimmt der Compiler an. Wenn ich med() aufrufe, wird 2 ausgegeben; wenn ich anschließend iausgeben() aufrufe, wird 0 ausgegeben.
Die beiden Variablen mit Namen i sind also komplett verschieden. Warum funktioniert das aber nicht, wenn ich in med() statt int i=2 beispielsweise String i = "hallo" schreibe? Wieso funktioniert die erste Variante, die zweite aber nicht?! Ich dachte eigentlich, es funktioniert gar keine Version!

[Java]public class test{
private int i; //erste Deklaration von i
public void med() {
int i=2; // zweite Deklaration von i
System.out.println(i);
}
public void isetzen() {
i = 5;
}
public void iausgeben() {
System.out.println(i);
}
}[/Java]

Julia
 
also die Variable i in med() ist nur in diesem Block/Methode gültig. Wenn du in das Syso "this.i" tippen würdest, würdest du die Variable der Klasse bekommen also das private i Attribut.... diese ist 0 (Default) wenn du nicht isetzen aufrufst.

Das mit dem String sollte eigentl. genauso funktionieren :

Java:
    public void med() {
        String i="hallo";               // zweite Deklaration von i
        System.out.println(i);
    }

Ausgabe: hallo bei Med aufruf
 
ich weiß nicht, was ich da dann vorhin probiert habe, es funktioniert tatsächlich auch String i = "hallo".

Trotzdem meine Frage:
warum darf ich das? Da i Klassenvariable (private int i) ist, ist der Geltungsbereich von i die ganze Klasse, ich darf doch dann auch i nicht noch mal neu deklarieren?!

Es funktioniert doch beispielsweise auch nicht die geschachtelte for-Schleife mit 2mal derselben Zählvariablen, da i bereits in der äußeren for-Schleife deklariert ist, darf ich i nicht in der inneren neu deklarieren:

Java:
for (int i=0; i<5; i++) {
        for (int i=4; i<6; i++) {}     //Fehlermeldung! 
}
 
Bei 2 For- Schleifen hast du 2 Variablen mit dem gleichen Namen innerhalb eines Blocks/Methode deklariert, dass geht nicht. Eine Schleife allein würde gehen.

Java:
public class test{
    private int i=5;             //erste Deklaration von i
    public void med() {
        String i="hallo";               // zweite Deklaration von i
        System.out.println(i);
        System.out.println(this.i);
    }    

    
    public static void main(String[] arhs){
    	test t=new test();
    	t.med();
    
    }
}

In deinem Beispiel gibt es aber 2 verschiedene Variablen einmal das Klassenattribut i und einmal eine Variable innerhalb eines Blocks i. Das sind zwei verschiedene Dinge. Das Klassen Attribut kannst du immer noch mittels this.i aufrufen.

Du kannst ja auch nicht sowas machen " private int i=5,i; das wäre das Gleiche wie 2 For- Schleifen
 
Zuletzt bearbeitet:
Du kannst ja auch nicht sowas machen " private int i=5,i; das wäre das Gleiche wie 2 For- Schleifen
nicht unbedingt das gleiche, die innere Schleife ist ein neuer Block, theoretisch könnte es umsetzbar und halbwegs praktikabel sein,
in diesem neuen Block die vorherige Variable zu überdecken, aber dem ist nicht so

eine lokale Variable darf über das Klassenattribut gehen, mehr ist nicht gedacht
 
... also zusammengefasst:

für Klassenvariablen gilt: gültig (verwendbar) in der gesamten Klasse; wird innerhalb einer Methode eine Variable mit demselben Namen wie die Klassenvariable deklariert, handelt es sich um 2 verschiedene Variablen.

für Variablen in Methoden/Blöcken gilt: sie sind gültig in der gesamten Methode/im gesamten Block und dürfen in der gesamten Methode/im gesamten Block nicht neu deklariert werden.

schon mal viiielen Dank für deine bisherige Hilfe!! 🙂
 

Neue Themen


Zurück
Oben