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
Version imprimable
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
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...).
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.