Accéder à un élément privé via un object créé inline en java

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 ):

  • vous créez une classe interne anonyme qui étend Human et fournit l’implémentation requirejse de la méthode test() .
  • cette méthode utilise une variable de sa “scope” englobante – et le compilateur est suffisamment intelligent pour détecter que cette variable est en fait une constante – car il n’y a aucune autre affectation ultérieure.

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