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 :

A quoi sert une classe interne Java


Sujet :

Langage Java

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 5
    Points : 0
    Points
    0
    Par défaut A quoi sert une classe interne Java
    Bonjour ,
    je souhaiterais savoir à quoi peut servir une classe interne en java et sa relation avec : l'association , agrégation composition , héritage ?
    une classe interne c'est une classe décrite dans une classe décrite ....
    Merci

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Une classe interne est juste une classe, comme n'importe quelle autre, mais dont le besoin n'est que nécessaire à l'intérieur de la classe : elle n'aurait aucune utilité, voire aucun sens à pouvoir être utilisée dans une autre classe. Elle a en pratique l'avantage d'avoir accès aux variables de la classe englobante, ce qui simplifie le couplage.
    Il faut tout de même distinguer les classes internes publiques des autres : on les utilise parfois juste pour faire comprendre qu'elles sont liées à l'usage de la classe englobante. Cela peut avoir un sens avec les interfaces : voir l'exemple de Map.Entry. Personnellement, je préfère éviter les classes (les Interface je les utilise), mais je peux les utiliser quand je fais des snippets (exemple, poc, etc.), ce qui me permet d'avoir qu'un seul fichier .java que je peux transmettre, comme par exemple, quand je publie des exemples sur le forum.

    Il faut également parler du fait qu'il y a des classes internes dites locales (à une méthode, voire un bloc), anonymes ou pas. Celles-là sont utilisées pour des besoins très ponctuels, à un endroit unique (comme par exemple un MouseListener très simple).

    Il n'y a donc pas de lien particulier avec le modèle de données (composition, agrégation, héritage, ou autre, etc...).
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 5
    Points : 0
    Points
    0
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    . Elle a en pratique l'avantage d'avoir accès aux variables de la classe englobante, ce qui simplifie le couplage. : alors si elle utilise les variables de laclasse englobate , elle doit heriter ? meme si les variables de la classe englobante sont déclarés privé une classe interne peut les utiliser ?
    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
    Class A 
    { attribut a1;
      attribut a2;
    ......
    Class B 
    {
    ......
    Class C 
    {
    .....
     
    }
    }
    }
    main()...
    {
    Class C c= new C(... ); 
    c.attribut a1= ...; 
    }
    Peut on faire comme ceci ?



    Merci

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Non, on ne peut pas instancier C en dehors de B, parce que la classe C n'existe que dans le scope d'une instance de la classe B, qui elle-même n'existe que dans le scope de l'instance d'une classe A. Si elle est interne à la classe, c'est justement qu'on ne devrait pas l'utiliser en dehors (Même s'il peut y avoir des moyens de le faire, sous certaines conditions). Si la classe doit être utilisée en dehors, elle ne devrait pas être interne.

    En plus, l'attribut appartient à la classe A : il est visible dans la classe C, donc peut être lu, ou modifié dans cette classe, mais n'appartient pas à C, donc on ne peut écrire c.a1, avec c de classe C.

    NB : en Java, une classe se décrit par class XYZ : pas de majuscule à class (comme pour tous les mots clefs Java). Et on écrit X x = new X() pas X x = new class X(). Idem pour l'accès à l'attribut (x.a1), si tant est qu'il soit accessible.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 5
    Points : 0
    Points
    0
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    Non, on ne peut pas instancier C en dehors de B, parce que la classe C n'existe que dans le scope d'une instance de la classe B, qui elle-même n'existe que dans le scope de l'instance d'une classe A. Si elle est interne à la classe, c'est justement qu'on ne devrait pas l'utiliser en dehors (Même s'il peut y avoir des moyens de le faire, sous certaines conditions). Si la classe doit être utilisée en dehors, elle ne devrait pas être interne.

    En plus, l'attribut appartient à la classe A : il est visible dans la classe C, donc peut être lu, ou modifié dans cette classe, mais n'appartient pas à C, donc on ne peut écrire c.a1, avec c de classe C.

    NB : en Java, une classe se décrit par class XYZ : pas de majuscule à class (comme pour tous les mots clefs Java). Et on écrit X x = new X() pas X x = new class X(). Idem pour l'accès à l'attribut (x.a1), si tant est qu'il soit accessible.

    Oui mais la class C existe aussi dans le scope de la class A puisque si C est dans B et B est dans A alors C est dans A ?
    Je suis un peu débutant ...

Discussions similaires

  1. A quoi sert une structure (class Struct)
    Par penguin50 dans le forum Ruby
    Réponses: 4
    Dernier message: 06/08/2008, 22h56
  2. [heritage] etendre une classe interne en dehors du package
    Par ChristopheH dans le forum Langage
    Réponses: 2
    Dernier message: 11/10/2004, 14h15
  3. [PL/SQL]Appel d'une classe/méthode java
    Par marsup54 dans le forum SQL
    Réponses: 4
    Dernier message: 30/06/2004, 16h44
  4. [Débutant][Conception] Erreur avec une classe interne
    Par Devil Redneck dans le forum Général Java
    Réponses: 5
    Dernier message: 11/06/2004, 15h45
  5. [Thread] Erreur dans une classe interne
    Par totof2308 dans le forum Général Java
    Réponses: 5
    Dernier message: 03/06/2004, 08h15

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