Innere Klassen-und lokalen Variablen
Warum muss ich erklären local variable
als final
wenn mein Inner class
definiert, die innerhalb der Methode verwenden muss ?
Beispiel :
class MyOuter2 {
private String x = "Outer2";
void doStuff() {
final String y = "Hello World";
final class MyInner {
String z = y;
public void seeOuter() {
System.out.println("Outer x is "+x);
System.out.println("Local variable is "+y);
MyInner mi = new MyInner();
mi.seeOuter();
}
}
}
}
Warum der String y
werden muss, um eine endgültige konstant ? Wie beeinflusst ?
InformationsquelleAutor der Frage NINCOMPOOP | 2012-04-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist die Antwort, die beiden sind in verschiedene Bereiche. So, die variable verändern könnte, bevor die innere Klasse zugreift. Macht es endgültig verhindert.
InformationsquelleAutor der Antwort ControlAltDel
Lokale Variablen immer live auf dem stack, der moment-Methode wird über alle lokalen Variablen sind Weg.
Aber Ihre innere Klasse Objekte auf heap auch nach der Methode, die über (Sagen wir eine Instanzvariable enthält, die auf die Referenz), so dass in diesem Fall es kann nicht auf Ihre lokalen Variablen, da Sie Weg sind, es sei denn, Sie markieren Sie Sie als Letzte
InformationsquelleAutor der Antwort mprabhat
Ist es, weil die innere Klasse innerhalb einer Funktion eigentlich eine Kopie der lokalen Variablen, weil die lokalen Variablen zerstört werden kann nach dem Aufruf der Funktion, während die Instanz der lokalen Klasse noch existiert. Um die zwei Kopien der lokalen Variablen immer denselben Wert haben(um Sie zu machen scheinen identisch), müssen Sie deklarieren die variable als final.
InformationsquelleAutor der Antwort charles_ma
Ich denke, dies ist zu verhindern, dass die Programmierer Fehler machen würden. Dieser Weg, der compiler erinnert den Programmierer, dass die Variablen nicht mehr zugänglich, wenn Sie verlassen, dass Methode. Dies ist kritisch, mit looping. Stellen Sie sich diesen code:
Wenn die
doIt()
- Methode aufgerufen wird, was gedruckt wird?i
geändert werden, während Schleifen.Um zu verhindern, dass Verwirrung, die Sie haben, kopieren Sie die variable auf eine lokale variable oder eine variable anlegen Finale, aber dann können Sie keine Schleife.
InformationsquelleAutor der Antwort Martijn Courteaux
Ihre innere Klasse final ist und so sollten Sie nicht in der Lage sein, um etwas ändern in deinem letzten Einheit.
InformationsquelleAutor der Antwort abson
Laut Java-memory-Modell die Nutzung von final-Variablen garantiert, dass die Letzte variable sind immer initialisiert.
Wir erhalten den Fehler, wenn wir versuchen, verwenden Sie lokale Variablen ohne Initialisierung.
mit final garantiert die innere Klasse, die lokalen Variablen, die verwendet worden ist, initialisiert.
InformationsquelleAutor der Antwort Vishal