2017-05-16 5 views
-3

ci-dessous sont quelques exemples de modificateurs d'accès java. Je ne peux pas comprendre clairement les réponses lorsque les classes ont des attributs dont le type est d'autres classes.Modificateur d'accès java - visibilité des attributs dont le type est autre classe. pourquoi est-ce visible ou pas?

package packageX; 
import packageY.*; 

public class A { 
    public int x; 
    private int y; 
    protected int z; 

    public A objA; 
    public C objC; 

    void test(){ 
     System.out.println(x); 
     System.out.println(y); 
     System.out.println(z); 

     System.out.println(objA.x); 
     System.out.println(objA.y); 
     System.out.println(objA.z); 

     System.out.println(objC.x); 
     System.out.println(objC.y);//not visible 
     System.out.println(objC.z);//?? why visible? 
    } 
} 

class B{ 
    public A objA; 
    public C objC; 

    void test(){ 
     System.out.println(x);//not visible 
     System.out.println(y);//not visible 
     System.out.println(z);//not visible 

     System.out.println(objA.x); 
     System.out.println(objA.y);//not visible 
     System.out.println(objA.z); 

     System.out.println(objC.x); 
     System.out.println(objC.y);//not visible 
     System.out.println(objC.z);//?? why visible? 
    } 
} 



package packageY; 
import packageX.*; 

public class C extends A{ 
    public A objA; 
    public C objC; 

    void test(){ 
     System.out.println(x); 
     System.out.println(y);//not visible 
     System.out.println(z); 

     System.out.println(objA.x); 
     System.out.println(objA.y);//not visible 
     System.out.println(objA.z);//not visible//??? why not visible? 

     System.out.println(objC.x); 
     System.out.println(objC.y);//not visible//??? why visible? 
     System.out.println(objC.z); 
    } 

} 

class D{ 
    public A objA; 
    public C objC; 

    void test(){ 
     System.out.println(x);//not visible 
     System.out.println(y);//not visible 
     System.out.println(z);//not visible 

     System.out.println(objA.x); 
     System.out.println(objA.y);//not visible 
     System.out.println(objA.z);//not visible 

     System.out.println(objC.x); 
     System.out.println(objC.y);//not visible 
     System.out.println(objC.z);//not visible//??? why not visible 
    } 
} 

Je ne peux pas comprendre quelques lignes avec // ??? pouvez-vous expier pourquoi les attributs sont visibles ou non?

+3

Veuillez envoyer tout le code pertinent au format texte plutôt qu'à une image. – biziclop

+1

S'il vous plaît également afficher toutes les classes pertinentes (c'est-à-dire: 'A') – Berger

Répondre

0

Cela explique l'accès https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

y n'est pas visible dans C car C étend A et A a fait y privé. Par conséquent C ne peut pas voir y.

z est protégée, les sous-classes peuvent voir z.

La classe B ne peut voir aucune de ces variables car elle n'hérite d'aucune autre classe et ne définit pas ces variables.

Impossible d'accéder à la classe B objA.y car y est privé. Vous ne pouvez pas accéder à une variable privée en dehors de la classe qui le déclare.

objC.z est visible car les membres protégés peuvent accéder par sous-classes.

Lire le lien fourni. Cela explique cela dans le premier tableau.

+0

Oui, je connais le cas de x, y, z. Ce que je me demande, c'est le cas d'objA et d'objC. Par exemple objC.z est visible dans la classe A, mais comme je sais que C est défini dans un autre paquet avec A, objC.z (protected-> devrait être vu dans le même paquet et ses sous-classes) ne devrait pas être visible dans A – pota

+0

mais isn 't A est super classe de C? – pota

+0

ObjC.z est hérité de A. z appartient à a. Il est protégé de sorte qu'il peut être accédé par une instance de C. Une instance de C peut être créée par n'importe quelle classe et ils peuvent accéder à z. Même si la super classe crée une instance de la sous-classe .. – Allan

0

Peut-être est-il temps de lire quelques documents de base?

private int a - visible que dans cette classe

protected int a - visible dans cette classe et dans toutes les classes d'enfants étendre cette classe

int a - visible de toutes les classes dans le même paquet que cette classe

public int a - visible depuis toutes les autres classes

+0

que diriez-vous objA.z dans la classe C. Comme C est sous-classe de A objA.z (protégé) dans C devrait être visible mais il n'est pas – pota

+0

ObjA n'est pas objC, seulement z appartenant à objC est visible dans objC. Pas d'autres objA.Si vous en avez besoin, utilisez 'public' ou si les classes sont dans le même paquet - visibilité du paquet sans modificateur. – Vadim