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 :

[POO] Notion de visibilité des classes


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 34
    Par défaut [POO] Notion de visibilité des classes
    Bonjour à tous.

    Ayant fait des recherches, je sais que :

    • Une classe décalrée public sera accessible n'importe où
    • Une classe déclarée private ne sera accessible que dans elle même
    • Si on ne précise rien, la classe est private-package, accessible uniquement dans le même package


    Lorsque que je créé un fichier java, contenant deux classes toutes les deux déclarée public, j'ai une erreur m'indiquant que je dois créer un fichier pour chaque classe. Par contre, si une des classe est déclarée public, et que je ne précise rien pour la seconde, alors je n'ai pas d'erreur de compilation.

    Je sais qu'il vaut mieux réserver un fichier par classe, c'est juste par curiosité que je pose cette question
    Merci à vous

    PS : La class contenant mon main, je dois la déclarer public ou private-package ?

  2. #2
    Modérateur
    Avatar de Gugelhupf
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    Décembre 2011
    Messages
    1 326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste Programmeur

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 326
    Billets dans le blog
    12
    Par défaut
    La seule question que je vois se situe à la dernière ligne de ton sujet (dans le "PS").

    C'est mon avis perso, mais je te conseille de créer toutes tes classes avec une visibilité public, pour te citer deux exemples, si tu crées des TU (tests unitaires) avec un nom de package différent que celui de la classe tu ne pourras pas y accéder dans ton TU à moins de passer par l'API d'introspection. De plus par expérience je peux te dire que le fait d'avoir une classe avec une visibilité package dans un projet web m'a causé bien des soucis et ce n'est pas le genre de problème que tu peux résoudre en deux temps trois mouvements avec la stacktrace. Maintenant il existe des cas un peu particuliers où je me permet d'utiliser des classes avec une visibilité package, mais elles se limitent à l'implémentation interne des API que je crée, afin que l'utilisateur de l'API ne se demande pas à quoi sert cette classe lorsqu'il utilise les fonctionnalités d’auto-complétion de son IDE.
    N'hésitez pas à consulter la FAQ Java, lire les cours et tutoriels Java, et à poser vos questions sur les forums d'entraide Java

    Ma page Developpez | Mon profil Linkedin | Vous souhaitez me contacter ? Contacter Gokan EKINCI

  3. #3
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2014
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Août 2014
    Messages : 262
    Par défaut
    Citation Envoyé par Compassio Voir le message
    Bonjour à tous.
    .....
    PS : La class contenant mon main, je dois la déclarer public ou private-package ?
    Sans réfléchir je dirai public !

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 34
    Par défaut
    Bonjour et merci pour vos réponses

    En fait j'aimerai surtout comprendre, par curiosité, pourquoi est-ce que lorsque je fais (dans le même fichier) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public class A {
    }
     
    public class B {
    }
    J'ai une erreur de compilation, alors que lorsque je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public class A {
    }
     
    class B {
    }
    Là je n'ai pas d'erreur. Pourquoi ?
    En cours à la fac, la classe principale qui contient la méthode main est déclarée sans le public.
    Du coup, pour une classe, lorsque l'on ne précise pas de visibilité, on est en private-package c'est ca ?

    Merci à vous

  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
    Cela ne compile pas parce qu'en Java, une classe publique doit être dans un fichier qui porte le nom de cette classe. C'est la règle.
    Donc comme deux classes ne peuvent pas porter le même nom dans le même fichier, elles ne peuvent pas toutes les deux être dans un fichier qui porte leur nom. Donc il ne peut pas y en avoir deux qui soient publiques. Seule la classe qui porte le même nom que le fichier a le droit d'être publique.

    Pourquoi cette règle de Java, c'est une question d'optimiser la compilation. Les classes publiques peuvent être utilisées par toutes les autres classes où qu'elles soient, on ne peut donc pas trop se permettre de se demander dans quel fichier se trouve telle classe publique. Il vaut mieux savoir qu'elle est dans ce fichier-là, point final.

    Citation Envoyé par Compassio Voir le message
    En cours à la fac, la classe principale qui contient la méthode main est déclarée sans le public.
    Du coup, pour une classe, lorsque l'on ne précise pas de visibilité, on est en private-package c'est ca ?
    Effectivement, la classe qui contient main() n'a pas besoin d'être public. Elle n'est pas utilisée par les autres classes, c'est l'inverse, c'est elle qui utilise les autres classes. Le truc qui l'utilise c'est le démarreur de la JVM, et il se fiche complètement de la visibilité de la classe de démarrage. En fait, elle peut même être private, ça fonctionnera très bien. J'y reviendrai plus tard.

    Il faut par contre noter que la méthode main(), elle doit être public static, sinon ça marche pas. Or en Java, ça n'a aucun intérêt qu'une méthode soit public static si la classe qui la contient n'est pas public : on ne va pas appeler la méthode si on ne peut pas appeler la classe... D'où le réflexe : j'ai une méthode public static, donc ma classe est publique. Dans le cas de main() qui n'est appelée par personne ce n'est pas nécessaire, mais bon va pas se triturer les méninges, il n'y a qu'à faire comme d'habitude.

    Citation Envoyé par Compassio
    Une classe déclarée private ne sera accessible que dans elle même
    Hmmm non. Une classe ne peut être déclarée private que si elle est à l'intérieur d'une autre classe. Et l'effet est alors qu'elle ne sera accessible que par la classe qui la contient. Ce n'est pas limité à elle-même, ce qui n'aurait aucun sens.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 34
    Par défaut
    Merci pour vos réponses. Honnêtement vous m'aidez beaucoup, je suis du genre à avoir beaucoup de questions, et vos réponses sont toujours de qualité !

    Une dernière chose, dans mes TD et TP, je vois souvent des attributs déclarés sans visibilité :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    static int age;
     
    void showInt(int a) {
      System.out.println(a);
    }
    Si je ne précise pas la visibilité d'un méthode ou d'un attribut, qu'est ce que cela produit ?
    Merci

  7. #7
    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
    package-private dans une classe,
    public dans une interface. De toute façon les membres d'une interface ne peuvent pas être autre chose que public.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Visibilité des classes
    Par zax-tfh dans le forum ASP.NET
    Réponses: 0
    Dernier message: 14/12/2009, 23h02
  2. Visibilité des classes et de méthodes, différence?
    Par stephane543 dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 12/08/2009, 17h55
  3. [POO] Appels statiques sur des classes
    Par daajack dans le forum Langage
    Réponses: 2
    Dernier message: 07/12/2007, 15h47
  4. [POO] Héritage et visibilité des attributs : pas de "protected" en JS ?
    Par Hervé Saladin dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 27/11/2007, 15h44
  5. [POO] [AVIS] L'utilité des classes
    Par Anduriel dans le forum Langage
    Réponses: 66
    Dernier message: 10/11/2005, 16h45

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