2017-06-06 2 views
0

Je pratiquais le concept de la Classe Intérieure et, à l'intérieur, la Méthode Classe Locale Locale.Besoin de la variable finale dans le concept de la classe interne

Je sais l'utilisation du mot-clé finale très bien mais dans ce programme, je ne suis pas en mesure de comprendre sa signification:

//method local inner class example 
package practice; 

public class OuterClass 
{ 
    void my_Method() 
    { 
     final int n=23;     //why final is required? 
     class MethodInner_Demo 
     { 
      public void print() 
      { 
       System.out.println("This is method local inner class: "+n); 
      } 
     } 
     MethodInner_Demo inner=new MethodInner_Demo(); 
     inner.print(); 
    } 

    public static void main(String[] args) 
    { 
     OuterClass outer=new OuterClass(); 
     outer.my_Method(); 
    } 

} 

Et sans utiliser final, il jette une erreur dans cette partie,

System.out.println("This is method local inner class: "+n); 

Exception dans le thread "principal" java.lang.Error: problème de compilation non résolues: ne peut pas se référer à la variable locale non-finale n définie dans une portée englobante

S'il vous plaît expliquer!

Merci.

+0

Vous semblez être en utilisant une ancienne version de Java - il n'est pas nécessaire pour que la variable soit finale en Java 8 (la version actuelle). – assylias

+0

S'il vous plaît jeter un oeil à: - https://stackoverflow.com/questions/3910324/why-java-inner-classes-require-final-outer-instance-variables –

+0

Je viens de vérifier la version, son 1.8.0_131 –

Répondre

1

La raison de cette restriction concerne principalement les problèmes de multi-threading et garantit que toutes ces variables ont des valeurs bien définies lors de l'accès à partir de la classe interne locale. Étant donné que la méthode accédant à la variable ou au paramètre local peut être invoquée après l'achèvement de la méthode dans laquelle la classe interne locale a été définie et donc les variables et paramètres locaux n'existent plus, la valeur de ces variables doit être gelée avant la classe interne locale l'objet est créé. Si nécessaire, vous pouvez copier une variable non finale dans une variable finale qui est ensuite accessible par la classe interne locale.

Référence http://cs-fundamentals.com/java-programming/java-method-local-inner-classes.php