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]
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:
publicvoidmed(){String i="hallo";// zweite Deklaration von iSystem.out.println(i);}
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:
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:
publicclass test{privateint i=5;//erste Deklaration von ipublicvoidmed(){String i="hallo";// zweite Deklaration von iSystem.out.println(i);System.out.println(this.i);}publicstaticvoidmain(String[] arhs){
test t=newtest();
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
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
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!!
um es gleich mal zu erwähnen (allerdings hast du ja schon 224 Posts..)
'java lokale variable' kann man in eine Suchmaschine eintippen und viele derartige Fragen selber klären