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 :

[Certification] private et protected, question


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de Satch
    Homme Profil pro
    Hypnothérapeute - Magicien
    Inscrit en
    Mars 2004
    Messages
    500
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Suisse

    Informations professionnelles :
    Activité : Hypnothérapeute - Magicien

    Informations forums :
    Inscription : Mars 2004
    Messages : 500
    Par défaut [Certification] private et protected, question
    Je suis en train de préparer ma certification JAVA programmer 1.5 .

    Donc, j'achète un bouquin, la référence en la matière.
    Seulement je tombe sur un truc qui me semble bizarre. Je cours vérifier sur Eclipse et j'ai un résultat contradictoire avec le livre...

    Explication :
    Dans le bouquin, je vois :
    "An instance may read and write protected fields that it inherits from its superclass. However, the instance may not read or write protected inherited fields of other instances"
    Ce que je traduirais par : "une instance peut lire et modifier les champs "protected" qu'elle hérite de sa superclasse. Cependant, elle ne peut pas le faire pour ceux des autres instances"

    Je conclus de cette phrase que ceci ne devrait pas marcher :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    package pack1;
     
    public class Base {
       protected int i;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    package pack2;
     
    import pack1.Base;
     
    public class SubClass extends Base {
       void aMethod(SubClass sub){
          sub.i = 1;
       }
    }
    Ici, dans la méthode aMethod, l'instance de Subclasse essaye de modifier le champ protected d'une autre instance (sub) que cette dernière hérite de Base.
    D'après l'auteur ce n'est pas permis... Et pourtant.

    Il se passe la même chose quand on essaye de modifier un champ privé d'une autre instance dans la classe qui déclare le champ privé, ce qui, toujours d'après le bouquin, n'est pas possible non plus.

    Donc voilà, maintenant je suis dans le doute. Faute de l'auteur ? Incompréhension de ma part ?
    J'ai toujours pensé avoir l'esprit clair sur ces notions de base de JAVA mais là je ne sais plus quoi penser.

  2. #2
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    L'expérience montre que l'on peut accéder aux variables des autres instances. La visibilité ne porte que sur la hiérarchie des classes et des packages.

    Il me semble très fortement que ceci compile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class MaClasse {
     
      private int nombre;
     
      public void setNombreToMaValeur(Classe autre) {
        autre.nombre = this.nombre;
      }
    }
    Idem pour le protected.
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  3. #3
    Membre éprouvé Avatar de Satch
    Homme Profil pro
    Hypnothérapeute - Magicien
    Inscrit en
    Mars 2004
    Messages
    500
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Suisse

    Informations professionnelles :
    Activité : Hypnothérapeute - Magicien

    Informations forums :
    Inscription : Mars 2004
    Messages : 500
    Par défaut
    Ben oui justement. Donc je pense que les auteurs se sont un peu planté sur ce coup là. Ou j'ai mal compris ce qu'ils voulaient dire.

    En plus les specs de JAVA sont claires :

    6.6.2 Details on protected Access
    A protected member or constructor of an object may be accessed from outside the package in which it is declared only by code that is responsible for the implementation of that object.

    6.6.2.1 Access to a protected Member
    Let C be the class in which a protected member m is declared. Access is permitted only within the body of a subclass S of C. In addition, if Id denotes an instance field or instance method, then:

    If the access is by a qualified name Q.Id, where Q is an ExpressionName, then the access is permitted if and only if the type of the expression Q is S or a subclass of S.
    If the access is by a field access expression E.Id, where E is a Primary expression, or by a method invocation expression E.Id(. . .), where E is a Primary expression, then the access is permitted if and only if the type of E is S or a subclass of S.

  4. #4
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut Re: [Certification] private et protected, question
    Salut,

    Citation Envoyé par Satch
    D'après l'auteur ce n'est pas permis... Et pourtant.
    Je pense que l'auteur a voulut dire ceci que tu ne pouvais pas accéder à la variable protected d'une instance de la classe parente, dans ton cas la seconde méthode provoque une erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class SubClass extends Base {
       void aMethod(SubClass sub){
          sub.i = 1;
       }
     
       void aMethod(Base base){
           base.i = 1;
        }
    }
    Citation Envoyé par Satch
    Il se passe la même chose quand on essaye de modifier un champ privé d'une autre instance dans la classe qui déclare le champ privé, ce qui, toujours d'après le bouquin, n'est pas possible non plus.
    Je ne comprend pas ce que tu veux dire... Que le code suivant ne serait pas permis ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class MaClasse {
        private int x;
     
        public void affect(Base other) {
            other.x = x;
        }
    }
    Sinon ajoute un exemple


    a++

  5. #5
    Membre éprouvé Avatar de Satch
    Homme Profil pro
    Hypnothérapeute - Magicien
    Inscrit en
    Mars 2004
    Messages
    500
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Suisse

    Informations professionnelles :
    Activité : Hypnothérapeute - Magicien

    Informations forums :
    Inscription : Mars 2004
    Messages : 500
    Par défaut
    pour les champs privés voici texto ce que je lis :

    A private variable may be used only by an instance of the class that declare the variable
    J'avais compris que ceci n'était pas permis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class Base {
    	private int i;
     
    	void aMethod(Base b){
    		b.i = 1;
    	}
    }
    C'est assez ambiguë mais ça va encore, je veux bien avouer avoir mal compris celle là.

    Par contre, plus je relis ce qu'ils disent à propos du protected, plus je me dis que c'est soit vraiment pas clair, soit faux.

    Edit :
    Bref, je met le tag résolu. On va pas jouer sur les mots toute la soirée ;)
    Les choses restent bien clair sur l'utilisation de protected, c'est le principal

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

Discussions similaires

  1. private et protected en python
    Par jobe dans le forum Général Python
    Réponses: 7
    Dernier message: 04/02/2008, 01h09
  2. Héritage : private/public/protected
    Par le Daoud dans le forum Langage
    Réponses: 5
    Dernier message: 24/10/2007, 13h47
  3. Autre reflection Private vs Protected?
    Par mathk dans le forum Langage
    Réponses: 32
    Dernier message: 10/08/2007, 18h55
  4. Réponses: 16
    Dernier message: 30/05/2007, 23h07
  5. problème de private , public , protected
    Par florantine dans le forum C++
    Réponses: 3
    Dernier message: 17/01/2006, 20h51

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