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 :

Question concernant l'accès aux méthodes publiques


Sujet :

Langage Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 55
    Points : 42
    Points
    42
    Par défaut Question concernant l'accès aux méthodes publiques
    Bonjour, je vais essayer d'être la plus claire possible mais c'est pas évident car je me mélange un peu avec cette notion.
    Pourriez-vous me répondre en énonçant des évidences et avec des exemples.
    Merci pour vos éclaricissements.

    Supposons deux classes A et B.
    1°) J'ai une méthode public dans la classe A.
    Pour y accéder,
    1°)a) je dois forcément l'appeler avec un objet de la classe A
    ou bien
    1°)b) je peux également avec un objet de classe B? En étant dans la classe B par exemple

    2°) Si réponse 1°)a) , où se situe la différence avec une méthode protégée?
    Cela vient il de l'accés aux classes dérivées?

    En fait, ça serait utile que vous me donniez des ex en disant là c pas pas possible car machin est privée.
    J'ai du mal à voir comment définir des méthodes publics ou privées ou protégées, à voir également les portées.

    Quand deux classes font partie du package par défaut, considèrent t on qu'elles font partie du même package?

    Merci encore


    [Modéré par Didier] : ajout de tag dans le titre - Les règles du forum Java

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 85
    Points : 92
    Points
    92
    Par défaut
    Alors soient 2 clases A et B :
    1) si une methode de la classe A est publique, tu pourra acceder à cette methode à partir de n'importe où, cependant tu ne peux l'appeller qu'avec un objet de la classe A.
    2)si une methode est privée, elle ne sera accessible que dans sa classe donc une methode de la classe A ne sera accessible que dans la classe A
    3) une methode protected sera accessible dans la classe A ainsi que dans ses sous classe: admettons que tu as une methode 1 dans la classe A et que tu as une classe C qui herite de A (qui est donc une sous classe de A), la methode 1 sera accessible dans la classe C.
    Les methodes d'une classe ne peuvent etre appelées par un objet d'une autre.
    Tu utilise des methodes privées quand elles sont necessaires uniquement à la classe dans laquelle elles sont definies etc etc
    j'espere que ce petit resumé t'aidera

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 55
    Points : 42
    Points
    42
    Par défaut
    Citation Envoyé par phoenix1998
    Alors soient 2 clases A et B :
    1) si une methode de la classe A est publique, tu pourra acceder à cette methode à partir de n'importe où, cependant tu ne peux l'appeller qu'avec un objet de la classe A.
    2)si une methode est privée, elle ne sera accessible que dans sa classe donc une methode de la classe A ne sera accessible que dans la classe A
    3) une methode protected sera accessible dans la classe A ainsi que dans ses sous classe: admettons que tu as une methode 1 dans la classe A et que tu as une classe C qui herite de A (qui est donc une sous classe de A), la methode 1 sera accessible dans la classe C.
    Les methodes d'une classe ne peuvent etre appelées par un objet d'une autre.
    Tu utilise des methodes privées quand elles sont necessaires uniquement à la classe dans laquelle elles sont definies etc etc
    j'espere que ce petit resumé t'aidera
    Ouais!!! une réponse claire!!!
    Donc je continue:

    1)Pour appeller ma méthode A dans ma classe B,il faut bien que l'objet A qui l'appelle ( private) soit définit dans ma classe B ( B "a un" A) ?

    1)a) J'ai le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class B{
      double méthode B() 
      A.méhodeA()
    }
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class A {
      double méthode A{return xA};
      private : double xA;
    }
    ça ça marche pas parce que A est privé, n'est-ce pas?


    3) la méthode 1 accessible dans la classe C peut être appellée avec un objet C sachant que 1 est public mais pas virtuelle? Peut elle être appellée avec un objet A , non défini dans C? Si oui, l'objet A doit être proteted c ça?

    Merci...

  4. #4
    Membre éclairé Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Points : 757
    Points
    757
    Par défaut
    Je vais préciser les choses pour compléter phoenix1998 ...

    Public :
    Si A a une classe avec une méthode m() public, TOUTES les classes possédant un objet A peuvent appeler cette méthode par A.m();

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class A{
             public A(); //constructeur
             public void m(); //methode publique de A
    }
     
    public class B{
             private A a; //objet A attribut de la classe B
             public B(); //constructeur
             public void m2(){a.m()}
    }
    Protected :
    La notion de protected s'applique à un package ou une classe héritière. Ainsi si une classe A possède une méthode protegée, TOUTES les classes appartenant au MEME PACKAGE ou HERITANT DIRECTEMENT DE A peuvent appelé la méthode protected de A.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    package p;
    public class A{
             public A(); //constructeur
             protected void m(); //methode protegee de A
    }
     
    package p;
    public class B{
             private A a; //objet A attribut de la classe B
             public B(); //constructeur
             public void m2(){a.m()}
    }
    Si une classe C appartient au package q, elle n'aura pas accès à la méthode m(à) de A, même si elle possède un attribut A

    Private :
    La méthode private est la plus restrictive de toutes ... elle n'est accessible que par la classe A elle-même ... AUCUNE classe autre que A ne peut accéder à ses méthodes privées...

    Static :
    Une méthode statique dans la classe A peut être appelée (en respectant les encapsulation précedemment citées) sans posséder d'attribut de classe A

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public class A{
             public A(); //constructeur
             public void m(); //methode publique de A
    }
     
    package p;
    public class B{
             //pas d'attribut de type A
             public B(); //constructeur
             public void m2(){A.m()}
    }

  5. #5
    Membre éclairé Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Points : 757
    Points
    757
    Par défaut
    class B {
    double méthode B()
    A.méhodeA()
    }

    et

    class A {
    double méthode A{return xA};
    private : double xA;
    }
    Il faut encapsuler toutes les methodes sinon on ne connait pas leur visibilité ^^

    3) la méthode 1 accessible dans la classe C peut être appellée avec un objet C sachant que 1 est public mais pas virtuelle? Peut elle être appellée avec un objet A , non défini dans C? Si oui, l'objet A doit être proteted c ça?
    Je capte pas toute la question en fait ... tu dis que 1() est publique ... jusque la ok ... oui cette methode peut etre appelée par toutes les classes. Après, je ne comprend pas ton histoire d'objet A défini dans C, c'est plutot C qui doit etre défini dans A si tu veux appeler sa méthode 1()... définir une classe A dans C se rapproche plus du concept de classe amicale (friend) rencontrées en C++ et non en Java (a moins que ca existe dans la 1.5 mais je pense pas)

    Donc, en résumé :
    Une methode publique peut etre appelée par toutes autres classes possédant un attribut A (peu importe qu'il soit public, protected ou private, mais en général les attributs de classes sont private et on fait de getters et setters pour y acceder)

    Voila j'espere que ces précisions ont pu t'apporter les réponses désirées

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 55
    Points : 42
    Points
    42
    Par défaut
    euh presque en fait c nettement plus clair.
    euh, et jute pour cette question:
    1°)
    j'ai mes deux classes A et B indépendantes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class C {
      public static void main(String[] args) {
      double y = B.méhodeB;
      }
    }
     
    class B { 
      public double méthode B() {
        A.méhodeA()
      } 
    }
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class A { 
      public double méthode A {
        return xA
      }; 
      private : double xA; 
    }
    J'ai la méthode B qui est appellée, donc au final, je me retouve en retour avec y qui fait référence à xA ( instance privée de A), c'est possible?

  7. #7
    Membre confirmé Avatar de benratti
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    471
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2004
    Messages : 471
    Points : 649
    Points
    649
    Par défaut
    Citation Envoyé par smag
    J'ai la méthode B qui est appellée, donc au final, je me retouve en retour avec y qui fait référence à xA ( instance privée de A), c'est possible?
    Bah oui, c'est le principe des setter et de getter... L'interet est de controle l'acces a des attributs d'une classe. Tu mets ses attributs private, et lorsque que tu veux acceder a la valeur d'un attribut, tu appelles le getter correspondant ( que tu auras bien evidement defini )... Meme chose si tu veux mettre a jour les attributs, tu passes par les setters...

    En faisant ca, tu ne donnes pas acces a l'attribut xA mais juste a sa valeur.

  8. #8
    Membre éclairé Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Points : 757
    Points
    757
    Par défaut
    public class C {
    public static void main(String[] args) {
    double y = B.méhodeB}
    }

    class B {
    public double méthode B() {A.méhodeA()}
    }

    class A {
    public double méthode A{return xA};
    private : double xA;
    };
    Comme l'a dit benratti, c'est tout a fait possible... cependant, il faut bien préciser :
    B possède-t-il un attribut instance de A ?
    Dans ton main je ne vois pas d'instance de B...
    autrement dit :pour que ce soit bon ton code doit etre ainsi :

    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
    public class C { 
    public static void main(String[] args) { 
    B b=new B();
    double y = b.méthodeB} 
    } 
     
    class B { 
    public double méthode B() {a.méthodeA()}
    private A a; //instancié dans ton constructeur de B par un new A() evidemment 
    } 
     
    class A { 
    public double méthode A{return xA}; 
    private double xA; 
    };
    ou bien si tu ne veux pas de variable, ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class C { 
    public static void main(String[] args) { 
    double y = B.méthodeB} 
    } 
     
    class B { 
    public static double méthode B() {A.méthodeA()}
    } 
     
    class A { 
    public static double méthode A{return xA}; 
    private static double xA; 
    };
    Le "static" permet de ne PAS instancié d'objet pour appeler la methode ... toutefois toute methode static ne peut manipuler QUE des objets locaux (appartenant à la méthode) ou bien static à la classe...

  9. #9
    Nouveau membre du Club
    Inscrit en
    Février 2004
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 23
    Points : 26
    Points
    26
    Par défaut
    smag a ecrit
    3) la méthode 1 accessible dans la classe C peut être appellée avec un objet C sachant que 1 est public mais pas virtuelle?
    En java les methodes sont toutes virtuelles par defaut contrairement au C++ ou il faut explicitement la declarer "virtual".

    Benratti a dit
    En faisant ca, tu ne donnes pas acces a l'attribut xA mais juste a sa valeur.
    Attention ceci est uniquement vrai pour les types primitifs. En effet le passage de parametres dans une methode quelle qu'elle soit se fait pas reference pour les types Objets et non pas par copie comme pour les types primitifs. On a pas la possibilite de choisir comme en C++.

  10. #10
    Membre confirmé Avatar de benratti
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    471
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2004
    Messages : 471
    Points : 649
    Points
    649
    Par défaut
    Citation Envoyé par mimil
    Benratti a dit
    En faisant ca, tu ne donnes pas acces a l'attribut xA mais juste a sa valeur.
    Attention ceci est uniquement vrai pour les types primitifs. En effet le passage de parametres dans une methode quelle qu'elle soit se fait pas reference pour les types Objets et non pas par copie comme pour les types primitifs. On a pas la possibilite de choisir comme en C++.
    Je me suis peut-etre mal explique ... Ce que j'entends par valeur c'est le contenu de l'attribut qui, dans le cas d'Objet, est un reference vers l'objet ... Ce que je voulais dire, c'est que le getter ne renvoie pas la reference de l'attribut mais bien son contenu ( valeur ou reference de l'objet qu'il contient ).

Discussions similaires

  1. Question sur l'accès aux method private
    Par Phantom_Lord21 dans le forum Caml
    Réponses: 1
    Dernier message: 02/07/2010, 20h24
  2. [Servlet + Class] question concernant plusieurs connections
    Par ShinJava dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 29/11/2004, 16h39
  3. Réponses: 7
    Dernier message: 10/09/2004, 14h28
  4. [Indy] Questions concernant l'envoi de mail
    Par delphicrous dans le forum Web & réseau
    Réponses: 3
    Dernier message: 24/06/2004, 15h06
  5. Question concernant l'API "WaitforSingleObject
    Par Drooxy dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 29/03/2003, 07h26

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