Veuillez vérifier le code Java ci-dessous:
public class Test { public static void main(String arg[]) throws Throwable { Test t = new Test(); System.out.println(t.meth().s); //OP: Old value System.out.println(t.meth().getVal()); //OP: String Implementation } private TestInter meth() { return new TestInter() { public String s = "String Implementation"; public String getVal() { return this.s; } }; } } interface TestInter { String s = "Old value"; String getVal(); }
4 Réponses :
Il n'y a rien de tel que Accès privilège même si vous utilisez la classe Cet exemple illustre le deuxième cas:
Il imprime Remplacement de la variable code> comme
méthode primordial code> en java. Nommez un nouveau type pour
Sous-classe code>, alors vous obtiendrez l'implémentation
"String" code>, lorsque vous accédez au type de référence de sous-classe.
protégé < / Code> seulement signifie que nous pouvons accéder à la variable dans une sous-classe mais non qu'elle peut être remplacée. p>
normale code> au lieu de
interface Code> Cela ne fonctionnera pas. Lorsque vous vous référez en utilisant le type de classe code> Super code>, vous obtenez uniquement l'instance
code> à partir de
Super code> Type et ainsi de suite ....
Cet exemple illustre le premier cas:
Exemple: p>
"implémentation de chaîne" code> p>
public String s = "String Implementation";
La variable Les variables d'interface sont vraiment conçues pour être des constantes - elles ne font pas partie de l'API à chaque mise en œuvre à fournir. En particulier, ils sont implicitement statiques et finaux. P> de la Section JLS 9.3 : P> Chaque déclaration de champ dans le corps d'une interface est implicitement publique, statique et finale. Il est permis de spécifier redondant tout ou tous ces modificateurs pour de tels champs. P>
blockQquote> Le fait que vous avez accédé au champ via une instance de mise en œuvre est hors de propos, ce code: p> est efficacement: p> S code> déclarée dans l'interface est entièrement séparé em> à partir de la variable
S code> que vous avez déclaré dans votre classe intérieure anonyme.
t.meth();
System.out.println(TestInter.s);
Vous auriez décourager l'utilisation i> ou recommander pour éviter les variables i> dans des interfaces, non?
@ Jonskeet mais même s'il étend une classe normale au lieu d'une interface, il obtient les mêmes résultats. Je l'ai testé. Suis-je correct, c'est ce que j'ai encadré dans ma réponse ... veuillez me corriger si je me trompe ... merci :)
@pinkpanther: Oui, vous obtenez les mêmes résultats, mais pour une raison légèrement différente. Vous avez absolument raison qu'il n'y ait pas de prime variable - il y aurait toujours deux variables différentes - mais c'est même pire i> avec la version d'interface car le champ est implicitement statique.
Les champs déclarés dans une interface sont des constantes.
Ainsi, lors de l'écriture p> Vous déclarez une constante s.
C'est pourquoi t.meth (). S code> est l'impression
ancienne valeur code> p>
t.meth (). Getval () code> getval () code> Impression du contenu du champ
s code> de votre classe anonyme. p> p>