Considérons l'extrait suivant.Casser l'encapsulation et cacher des informations dans Java
package breakoop;
public class BreakOOP {
public static class A{
private int a;
}
public static class B extends A{
public int f(){
return super.a;
}
}
public static void main(String[] args) {
B b = new B();
System.out.println(b.f());
}
}
L'exemple ne compile que si A
et B
sont encapsulées dans la classe BreakOOP
.
Cela semble aller à l'encontre de certains des concepts fondamentaux de la POO. Quelqu'un peut-il expliquer pourquoi cela compile? Quel est le raisonnement derrière tout cela?
Vous Je me réfère à 'super.a', je suppose, qui compile parce que la spécification le dit, c'est-à-dire que tout membre privé est visible dans la portée de la classe supérieure, c'est-à-dire dans' BreakOOP' dans votre cas e (Je vais devoir chercher la section pertinente de la JLS). – Thomas
Les classes internes obtiennent les règles de visibilité de leurs classes parentes. Pourquoi c'est? - Jusqu'à débattre, c'est juste comme ça se passe en Java. Ainsi, accéder à super.a à partir de B est comme deux variables privées dans la classe BreakOOP. Si vous voulez une protection plus étendue, vous devrez les déplacer dans différentes unités de compilation. – mtj
Copie possible de [Accès aux champs privés de superclasse en utilisant le super mot-clé dans une sous-classe] (http://stackoverflow.com/questions/31478718/access-to-superclass-private-fields-using-the-super-keyword-in -a-subclass) –