IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Visibilité d'une variable protected


Sujet :

Langage Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 109
    Points : 108
    Points
    108
    Par défaut Visibilité d'une variable protected
    Bonjour,
    J'ai vraiment un problème avec la visibilité du protected. Dans la FAQ java c'est écrit:
    "rien" ou défaut Les variables, méthodes ou classes définies sans modificateur sont accessibles par toute classe appartenant au même package. Attention : les variables sans modificateur ne sont pas accessibles aux classes fille définies dans un autre package.
    protected Les variables, méthodes ou classes définies comme protégées ne sont accessibles que par les classes filles et classes du même package.

    Une variable protected est comme "rien" ou défaut pas accessible aux classes fille définies dans un autre package.

    Quel est la différence entre rien et protected ?

    Merci

  2. #2
    Membre actif

    Profil pro
    Inscrit en
    Décembre 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 50
    Points : 273
    Points
    273
    Par défaut
    Bonjour,

    Les variables "rien" ne sont pas toujours accessibles aux classes filles. Alors que les variables protected le sont toujours.

  3. #3
    Membre habitué Avatar de zhouyu
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2009
    Messages : 90
    Points : 143
    Points
    143
    Par défaut
    Si les définitions sont juste :

    - "rien" les variables,méthodes,etc.. sont accessibles par toutes les classes du même package, SEULEMENT du même package.

    - "protected" même package PLUS les classes enfants, même les enfants d'un autre package

    L'intérêt du protected c'est surtout pour laisser l'accès aux classes enfants.

    Personnellement je ne me suis jamais servis du "rien" ou "défaut" je met en "public" dans ce cas là. Mais bon j'ai fais peu de Java :p.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 109
    Points : 108
    Points
    108
    Par défaut
    Citation Envoyé par zhouyu Voir le message
    - "protected" même package PLUS les classes enfants, même les enfants d'un autre package
    Ben mon problème c'est que justement ça ne compile pas !

    L'exemple suivant le montre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    package p;
    public class Parent {
    	int xDefaut = 11;
    	protected int xProtected = 9;
    	public int xPublic = 10;	
    }
    
    package other;
    import p.*;
    public class Enfant extends Parent {
    	public static void main(String[] args) {
    		p.Parent p = new p.Parent();
    		System.out.println("Public" + p.xPublic);
    		// ne compile pas pourquoi ??
    		 System.out.println("xProtected" + p.xProtected);
    		 //ne compile pas, c'est normal !
    		 System.out.println("xDefault" + p.xDefaut);
    	}
    }
    Qui m'explique ? merci

  5. #5
    Membre averti
    Homme Profil pro
    Java
    Inscrit en
    Mai 2011
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2011
    Messages : 170
    Points : 444
    Points
    444
    Par défaut
    Ton context est totalement différent ;-)

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 109
    Points : 108
    Points
    108
    Par défaut
    Citation Envoyé par kinaesthesia Voir le message
    Ton context est totalement différent ;-)
    Je ne comprends pas l'explication.

  7. #7
    Membre averti
    Homme Profil pro
    Java
    Inscrit en
    Mai 2011
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2011
    Messages : 170
    Points : 444
    Points
    444
    Par défaut
    Ta méthode main est static ce qui signifie qu'elle n'est pas dans le même contexte que ta classe Enfant ni même celle de Parent que tu la déclares dans ton fichier Enfant.java ou Parent.java.

    De plus tu déclares un objet Parent et tu essayes d'accéder à une de ses variables protected. Ce n'est pas parce que ton objet est instancié dans une classe fille que tu vas avoir accès à ses variables protégées.

    Si tu veux une explication plus banale, tu peux te dire que cette méthode n'a pas de classe etpeux être déclarée n'importe tout.

    Si tu veux accéder à ta variable protected, il te faudra créer une méthode qui n'est pas static dans ta classe Enfant et l'utilisé directement et non pas instancié un objet Parent puisque par héritage ton objet Enfant est automatiquement un objet parent.

  8. #8
    Membre habitué Avatar de zhouyu
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2009
    Messages : 90
    Points : 143
    Points
    143
    Par défaut
    En effet dans les méthodes static tu ne peux pas accéder à ta classe direction vu qu'on peu utiliser ces méthodes sans instancier d'objet de cette classe.
    De ce fait "this" n'existe pas dans une méthode static.

    Et puis initialiser tes variables de la sorte me semble un peu bizarre. Je ferai un constructeur par défaut à ta place .

  9. #9
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par kinaesthesia Voir le message
    Ta méthode main est static ce qui signifie qu'elle n'est pas dans le même contexte que ta classe Enfant ni même celle de Parent [blah blah blah]
    Non. C'est bien une histoire de contexte, et on ne peut en effet pas atteindre une variable protected non-static dans un contexte static. Mais l'explication ne tient pas debout.

    Une variable private et une variable default non-static peuvent très bien être accédées dans un contexte static. Le problème exposé ici ne se pose qu'avec protected, et avec aucune autre visibilité.

    protected, dans le cas non-static, a une particularité. Il a la même visibilité que default, mais une classe fille peut également voir les propriétés protected des classes mères sur l'instance en cours. Et sur l'instance en cours seulement.

    En contexte static il n'y a pas d'instance en cours, donc pas d'accès. Mais même en contexte non-static, on ne peut pas accéder aux variables protected des autres instances. Alors que la visibilité de private et default ne s'intéresse pas du tout à s'il y a une instance en cours.

    Citation Envoyé par zhouyu Voir le message
    En effet dans les méthodes static tu ne peux pas accéder à ta classe direction vu qu'on peu utiliser ces méthodes sans instancier d'objet de cette classe.
    De ce fait "this" n'existe pas dans une méthode static.
    Et alors ? C'est pas la question.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 109
    Points : 108
    Points
    108
    Par défaut
    Citation Envoyé par zhouyu Voir le message
    Et puis initialiser tes variables de la sorte me semble un peu bizarre. Je ferai un constructeur par défaut à ta place .
    Il ne s'agit que d'un exemple pas d'un exercice de style ! Mais merci quand même.

    Citation Envoyé par thelvin Voir le message
    protected, dans le cas non-static, a une particularité. Il a la même visibilité que default, mais une classe fille peut également voir les propriétés protected des classes mères sur l'instance en cours. Et sur l'instance en cours seulement
    .
    Auriez-vous un exemple pour me l'expliquer ? C'est un peu abstrait pour moi.

    Je pose cette question de protected et de visibilité car c'est exactement le style de questions que l'on trouve dans l'examen pour l'obtention du SCJP Oracle.

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 109
    Points : 108
    Points
    108
    Par défaut
    J'ai parcouru le site et trouvé cette page:
    http://armel-ndjobo.developpez.com/t...ontrole-acces/

    L'auteur dit au chapitre VII:
    Protected : il est presque identique au modificateur par défaut. Cependant, en plus des classes du même package, les classes dérivées peuvent accéder aux elements protected d'une classe.

    Et dans le tableau qui suit on voit qu'au sein d'une sous-classe dans un package différent protected permet d'accéder par héritage.
    J'aurais simplement voulu un exemple. Merci

  12. #12
    Membre habitué Avatar de zhouyu
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2009
    Messages : 90
    Points : 143
    Points
    143
    Par défaut
    Re. Désolé pour mon hors sujet alors...
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    public class A{
      protected int var1;
     
      public A(){var1 = 0;}
    }
     
    public class B : A{
      public B(){this.var1 = 1;}//autorisé car c'est ton instance de B qui va mettre à jour var1, c'est la variable de cette instance que tu mets à jour
     
      public void methode()
      {
        A myA = new A();
        myA.var1 = 2;//ne fonctionne pas car myA n'est pas l'instance en cour si j'ai bien compris, pour ce cas var1 doit etre public ou defaut si dans le meme package
      }
    }

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 109
    Points : 108
    Points
    108
    Par défaut
    Merci pour les explications. C'est nettement plus clair !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 16/03/2009, 09h22
  2. Visibilité d'une variable
    Par dragonno dans le forum Langage
    Réponses: 5
    Dernier message: 06/03/2009, 09h00
  3. visibilité d'une variable
    Par greg08 dans le forum Langage
    Réponses: 1
    Dernier message: 07/11/2008, 17h45
  4. [Tableaux] visibilité d'une variable dans une fonction
    Par grinder59 dans le forum Langage
    Réponses: 2
    Dernier message: 10/05/2007, 18h06
  5. Visibilité d'une variable
    Par nenoeil dans le forum Langage
    Réponses: 3
    Dernier message: 09/07/2004, 14h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo