2016-09-27 4 views
3

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?

+1

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

+0

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

+0

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

Répondre

3

Cochez cette case: https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html. Il indique qu'il augmente l'encapsulation en permettant à la classe static d'accéder aux membres privés de la classe de niveau supérieur (parfois vous devrez peut-être faire cela). Et a est membre privé de classe A, qui est dans le cadre de BreakOOP, ce qui le rend accessible à l'intérieur de la classe B.

1

Les Java Language Specification états:

Un membre de la classe privée ou constructeur est accessible uniquement dans le corps de la classe de niveau supérieur (§7.6) qui renferme la déclaration du membre ou constructeur.

Puisque les classes A et B sont définis dans le corps de BreakOOP cette règle et applique B peut voir les membres privés de A.

En ce qui concerne les concepts OOP: depuis A et B sont les classes internes statiques, ils ne sont pas la relation spéciale du cycle de vie avec BreakOOP que les véritables classes internes ont (vous n'avez pas besoin d'une instance de BreakOOP pour créer un nouvelle instance de A ou B mais ils ont encore une relation un peu particulière en ce sens qu'ils ont accès aux députés. S'ils ne devraient pas avoir ce genre de relation ils ne devraient pas être les classes internes, mais de véritables classes supérieures de niveau.