Je suis nouveau sur Java et j’essaie quelques méthodes d’access et j’ai rencontré quelque chose que je ne comprends pas. Le code ci-dessous fonctionne bien, affiche 9 et ne donne aucune erreur de compilation. Je pense que ce code devrait donner une erreur de compilation et que le nombre devrait être inaccessible depuis la méthode de test, car new Human () est une instance d’une classe totalement différente. Quelqu’un peut-il m’expliquer ce qui se passe ici?
public class Test{ public static void main(Ssortingng[] args) { int number = 9; test("holla",new Human(){ @Override void test() { // TODO Auto-generated method stub System.out.println(number); // I think this line should not comstack } }); } private static void test(Ssortingng a ,Human h){ h.test(); } }
Classe humaine
public abstract class Human { abstract void test(); }
Ceci est parfaitement valable (pour java8 – auparavant, vous auriez besoin du mot-clé final
lors de la déclaration du number
):
test()
. Pour “invalider” votre exemple: ajoutez simplement une affectation
number = 42;
dans la méthode principale – après avoir défini cette classe interne anonyme. Ou utilisez une version de java plus ancienne que java8.
N’oubliez pas que les classes internes anonymes sont des fermetures et que la machine virtuelle Java copie les valeurs requirejses “de l’intérieur” depuis l’extérieur. Mais quand la valeur extérieure change – quelle valeur doit être copiée. Voir ici pour plus de lecture.
Vous avez raison avant le java 8 .
De plus, une classe locale a access à des variables locales. Cependant, une classe locale ne peut accéder qu’aux variables locales déclarées finales. Lorsqu’une classe locale accède à une variable locale ou à un paramètre du bloc englobant, elle capture cette variable ou ce paramètre.
Les variables locales doivent être final
afin d’être accessibles dans les classes anonymes.
À partir de Java 8, les variables finales sont également autorisées à accéder à l’intérieur.
Cependant, à partir de Java SE 8, une classe locale peut accéder aux variables locales et aux parameters du bloc englobant qui sont finaux ou effectivement finaux. Une variable ou un paramètre dont la valeur n’est jamais modifiée après son initialisation est effectivement final.
essayer
int number = 9; number=10;
maintenant, le number
n’est pas du tout effectivement final et vous obtenez une erreur du compilateur disant “Le numéro de la variable locale définie dans une scope englobante doit être final ou effectivement final” .
Vous voudrez peut-être lire Différence entre final et final final