2016-06-01 2 views
0

J'apprends Java en utilisant le livre Java: The Complete Reference. Je suis actuellement au chapitre 9 et donc juste inroduced aux paquets. Sur la page 187, il est dit "Si vous souhaitez autoriser un élément à être vu en dehors de votre package actuel, mais uniquement aux classes qui sous-classent votre classe directement, déclarez cet élément protégé". Ce que je comprends de ceci est, une sous-classe qui réside dans un paquet, dites 'B', et l'extension d'une classe qui est définie comme publique dans un autre paquet 'A', ayant un membre nommé "proc", puis disponible dans toutes les sous-classes, y compris les sous-classes définies en dehors du paquet 'A' actuel, je dois le marquer comme protégé. Maintenant, jetez un oeil à ma mise en œuvre de la sous-classe définie à l'intérieur package « B »:Impossible d'accéder aux membres protégés d'une classe à partir d'une sous-classe définie dans un package différent

package subapp; 
import app.*; 

public class Test extends App { 

    public Test() { 
     App app = new App(); 
     System.out.println(app.proc); // error 
    } 
} 

Je suis sûr que tous les paquets (dans les deux fichiers de classe) sont correctement chargés, superclasse « directe » de test et son constructeur non paramétré, accessible au public, proc est marqué comme protégé et la fonction main() n'a pas de problème. Mais je reçois une exception d'exécution lors de l'exécution de subapp.Test qui dit "proc a protégé l'accès dans/superclasse chemin/.Est-ce que je reçois l'instruction livre erroné ou l'affirmation elle-même est fausse

+0

[ici] (http://stackoverflow.com/a/33627846/276052) est un bon tableau illustrant les bases du modificateur d'accès 'protected'. – aioobe

Répondre

1

Vous étendez déjà App, de sorte que vous ne veulent pas créer une nouvelle application dans le constructeur., essayez quelque chose comme ça si la variable est protected.

public Test() { 
    System.out.println(this.proc); 
} 

la raison pour laquelle il ne fonctionne pas pour vous est en ce moment vous êtes un nouveau lieu fait App au sein le constructeur, puis en essayant d'accéder à la valeur proc de App directement, au lieu de l'héritage par l'intermédiaire de

Si la valeur proc n'est pas correcte grâce à cela, vous pourriez avoir à le mettre avant la System.out.println(this.proc); Ou vous pouvez appeler le constructeur super(); avant d'imprimer la valeur si le proc obtient l'initialisation du constructeur App, tels que:

public App() { 
    proc = "test"; 
} 

//..... 

public Test() { 
    super(); 
    System.out.println(this.proc); 
} 
+0

Merci, cela m'a aidé. Mais pourquoi ne puis-je pas utiliser le membre protégé comme je le fais dans mon code? Je suis toujours "à l'intérieur" Test (une sous-classe) à droite? –

+0

@Devashish Vous pouvez appeler 'super();' dans le constructeur si le constructeur parent est en train d'initialiser la variable 'proc'. Voir mon edit si c'est le cas. Mais la raison pour laquelle cela ne fonctionne pas pour le code que vous avez maintenant est que même si vous êtes dans 'Test' (une sous-classe), vous essayez d'accéder aux valeurs de' App' en dehors de son modificateur d'accès. Les valeurs 'protected' ne sont accessibles qu'aux sous-classes, donc quand vous étendez' App' vous obtenez un accès direct à toutes les variables/méthodes 'protected' et' public' sans avoir à créer une nouvelle instance de l'objet – Orin

+0

Merci ... c'est clair à présent :) –