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

avec Java Discussion :

[Java 1.5] Encapsulation de Variables


Sujet :

avec Java

  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2008
    Messages
    190
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 190
    Par défaut [Java 1.5] Encapsulation de Variables
    Bonjour je ne comprends pas du tout pourquoi le retour de la fonction de maiin donne 0 et 10.
    J'aurai juré de mille feux qu'on obtienne une erreur de compilation. Etant donné qu'on a une variable protégée par private, un objet instancié, or cet objet devrait aller dans le tas, et par conséquent ne devrait pas pouvoir accéder à la variable déclarée avec le modificateur private.
    J'ai refait le même chose -une fonction main, et instancié un objet AQuestion- mais en créant un objet à partir d'un autre package, effectivement on ne peut pas accéder à la vatriable. Mias ici étant donné qu'on déclare un objet dans la même classe, celui ci peut accéder à une vairable déclarée avec le modificateur private. C'est fou! Ca voudrait donc dire que je n'ai rien compris à l'encapsulation ? Donc au modèle objet ? C'est possible, si quelqu'un pouvait m'éclairer.

    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
     
    public class AQuestion
        {
             private int i = giveMeJ();
             private int j = 10;
     
             private int giveMeJ()
             {
                  return j;
             }
     
             public static void main(String args[])
             {
                  System.out.println((new AQuestion()).i);
                  System.out.println((new AQuestion()).j);
             }
        }
    Passez de joyeuses fêtes.
    Bien à vous.

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    l'encapsulation concerne la classe, pas les instances. Toute instance (ou méthode statique d'ailleurs) de A a accès à l'ensemble des membres privés de toutes instance de A.

  3. #3
    Membre confirmé
    Inscrit en
    Décembre 2008
    Messages
    190
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 190
    Par défaut
    Merci pour ta réponse Tchize
    Citation Envoyé par tchize_ Voir le message
    l'encapsulation concerne la classe, pas les instances. Toute instance (ou méthode statique d'ailleurs) de A a accès à l'ensemble des membres privés de toutes instance de A.
    Je ne comprends pas ce que tu dis :
    encapsulation concerne la classe
    J'ai bien compris que toutes les méthodes -sauf static- peuvent avoir accés aux variables protégées par le modificateur private, par contre à la création d'un objet, dans la classe main, je n'arrive pas à le comprendre.

    Cordialement.

  4. #4
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Eh bien ce que ça veut dire c'est que du code placé dans une classe, que ça soit dans le cadre d'une méthode statique, d'une initialisation ou d'une méthode de classe, aura accès à tout ce qui est privé de n'importe quelle instance (ou statique) de cette classe.

  5. #5
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par peuplier Voir le message
    J'ai bien compris que toutes les méthodes -sauf static-
    Nan nan. Toutes.

    Static ou pas, c'est dans la même classe => accès à ce qui est private.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    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
    Salut,

    Citation Envoyé par peuplier Voir le message
    J'ai bien compris que toutes les méthodes -sauf static- peuvent avoir accés aux variables protégées par le modificateur private, par contre à la création d'un objet, dans la classe main, je n'arrive pas à le comprendre.
    Les éléments private sont bien accessible depuis une méthode static de la même classe. De même que l'on peut accéder aux éléments private d'un autre instance de la même classe.

    Donc il n'y a rien d'anormal dans ton code.



    Quand à ton résultat il n'a rien à voir avec la visibilité des variables, mais avec le mécanisme d'instanciation des objets.

    Lorsque on crée une nouvelle instance d'une classe via new, on passe par plusieurs étapes :
    1. La mémoire nécessaire à l'objet est alloué, et tous les attributs sont initialisés à null/0/false selon leurs types.
    2. La classe parente est initialisé (Object dans ton cas)
    3. La JVM exécute le code "en ligne" lors de la déclaration des attributs et les éventuels blocs d'instance (du code entre { } directement dans la classe).
    4. Enfin le code du constructeur lui même est exécuté.


    Donc lorsque la JVM exécute le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private int i = giveMeJ();
    L'attribut j (déclaré en dessous) existe déjà, mais il n'a pas été initialisé et vaut donc 0. Du coup i prend la valeur 0...


    a++

  7. #7
    Membre confirmé
    Inscrit en
    Décembre 2008
    Messages
    190
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 190
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Salut,
    Quand à ton résultat il n'a rien à voir avec la visibilité des variables, mais avec le mécanisme d'instanciation des objets.
    Je pense que ça doit être le point que je n'ai pas compris. Mais à ce moment là pourrais tu nous expliquer comment et pourquoi qu'on accède pas à une variable privées lorsqu'on instancie un objet à partir d'un autre package ? Effectivement si c'est ce point que je n'ai pas compris il serait bon que je revoie, aurais tu un bon tuto ?


    Citation Envoyé par adiGuba Voir le message
    Donc lorsque la JVM exécute le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private int i = giveMeJ();
    L'attribut j (déclaré en dessous) existe déjà, mais il n'a pas été initialisé et vaut donc 0. Du coup i prend la valeur 0...
    S'il y a bien une chose que j'ai retenu, c'est bien le mécanisme d'initialisation, j'avais compris pourquoi la valeur est nésséçaisserement 0.

    @Thelvin
    Nan nan. Toutes.
    Static ou pas, c'est dans la même classe => accès à ce qui est private.
    c'était une chose en effet que j'avais oublié, où pas retenue, tout au moins j'avais retenu le contraire.

    Merci à tous, et passez un bon reveillon les amis.

  8. #8
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par peuplier Voir le message
    Mais à ce moment là pourrais tu nous expliquer comment et pourquoi qu'on accède pas à une variable privées lorsqu'on instancie un objet à partir d'un autre package ?
    Parce que c'est dans la définition du language

    privé: accessible uniquement depuis la classe
    protégé: accessible depuis la classe, ses descendants et les classes du même package
    public: accessible par tout le monde
    defaut: visible de la classe et du package, mais pas depuis les descendants qui se trouveraient dans un autre package.

  9. #9
    Membre confirmé
    Inscrit en
    Décembre 2008
    Messages
    190
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 190
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Parce que c'est dans la définition du language

    privé: accessible uniquement depuis la classe
    protégé: accessible depuis la classe, ses descendants et les classes du même package
    public: accessible par tout le monde
    defaut: visible de la classe et du package, mais pas depuis les descendants qui se trouveraient dans un autre package.
    Merci

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 11/02/2006, 12h07
  2. Recuperer variable Javascript dans une variable Java
    Par drizztoli dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 22/09/2005, 14h58
  3. Variable Java dans JavaScript
    Par blaiseac dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 01/12/2004, 14h09
  4. [JSP] [débutant] affectation variable java
    Par RENAULT dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 26/07/2004, 15h44

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