Classe interna e variabili locali

Perché devo dichiarare una local variable come final se la mia Inner class definita all’interno del metodo deve usarla?

Esempio :

 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(); } } } 

}

Perché la stringa y deve essere una costante finale? Come influisce?

La risposta è che i due sono in ambiti diversi. Quindi quella variabile potrebbe cambiare prima che la class interna acceda a essa. Rendendolo definitivo lo impedisce.

Le variabili locali vivono sempre in pila, il metodo momento è finito tutte le variabili locali sono sparite.

Ma i tuoi oggetti di class interna potrebbero essere in heap anche dopo che il metodo è finito (Supponiamo che una variabile di istanza rimanga sul riferimento), quindi in quel caso non può accedere alle variabili locali da quando sono finite, a meno che non le contrassegnali come finali

È perché la class interna all’interno di una funzione fa effettivamente una copia della variabile locale perché la variabile locale può essere distrutta dopo la chiamata alla funzione mentre l’istanza della class locale esiste ancora. Per fare in modo che le due copie della variabile locale abbiano sempre lo stesso valore (per farle sembrare identiche), devi dichiarare la variabile come definitiva.

Penso che questo serva a impedire che il programmatore commetta errori. In questo modo, il compilatore ricorda al programmatore che la variabile non sarà più accessibile quando lasci quel metodo. Questo è fondamentale con il loop. Immagina questo codice:

 public void doStuff() { InnerClass cls[] = new InnerClass[100]; for (int i = 0; i < 100; ++i) { cls[i] = new InnerClass() { void doIt() { System.out.println(i); } }; } } 

Quando viene chiamato il metodo doIt() , cosa verrà stampato? i cambiato durante il ciclo. Per evitare tale confusione, devi copiare la variabile su una variabile locale o creare la variabile finale, ma in questo modo non sarai in grado di eseguire il ciclo.

La tua class interiore è definitiva e quindi non dovresti essere in grado di modificare nulla dall’interno della tua quadro finale.

Secondo il modello di memoria Java, l’uso della variabile finale garantisce che la variabile finale sia sempre inizializzata. Otteniamo un errore quando proviamo a utilizzare la variabile locale senza inizializzazione. usando la finale garantisce la class interna che la variabile locale che è stata usata viene inizializzata.