2010-04-23 6 views
1

Je suis nouveau à Java et que la question suivante concernant les classes internes:classes Java Inner

Lors de l'implémentation d'une classe interne, dois-je déclarer ses attributs et la portée des méthodes à savoir public, privé, protégé?

EDIT: En l'absence de délégués (comme en C#) quelqu'un pourrait-il mentionner comment implémenter un système de messagerie en Java permettant la communication entre plusieurs formulaires (Jframe)? J'ai lu que je peux utiliser des classes internes pour cela, mais on me dit aussi que je ne devrais pas implémenter des classes internes de plus de quelques lignes. Quelle école devrais-je suivre?

+2

http://java.sun.com/docs/books/tutorial/java/javaOO/nested.html – JRL

Répondre

3

Si vous le souhaitez.

Une classe interne est grossièrement parlant comme n'importe quelle autre classe. (Sauf que si vous ne le déclarez pas statique, il aura une référence EnclosingClass.this.)

+6

Peut-être plus comme un EnclosingClass.ce référence? – jjujuma

+0

@jjujuma: bien sûr, merci. – aioobe

2

Je suggère de traiter les classes internes en private.

En Java, une classe externe et toutes ses classes imbriquées (y compris internes) peuvent se tripoter mutuellement private s. (Le bytecode généré peut être inutilement détaillé avec des méthodes d'accès synthétiques supplémentaires, mais il est hautement improbable que cela compte.)

Du point de vue de l'interface, une classe ayant des types de classes internes bizarres est un peu bizarre. Et plus difficile à tester si vous êtes dans ce genre de chose. Trop souvent, les types imbriqués sont créés parce que créer un nouveau fichier dans un mauvais IDE est un peu douloureux - ne soyez pas tenté avec des raccourcis désagréables. Ceci dit, les classes internes sont très utiles. Utilisez-les avec goût.

2

Lors de l'implémentation d'une classe interne, dois-je déclarer ses attributs et ses méthodes, c'est-à-dire public, privé, protégé?

Cela dépend entièrement de la façon dont vous voulez que la classe interne se comporte. Par défaut, une classe interne est non statique:

public class Example1 
{ 
    int a; 

    public class Example2 
    { 
    int b; 

    void test() {} 
    } 
} 

Une classe interne non-statique peut être instancié uniquement à l'intérieur d'une méthode non statique de la classe externe. En effet, chaque instance d'une classe interne non statique doit être associée à une instance de la classe externe. Dans un sens, chaque instance d'une classe interne non statique existe à l'intérieur d'une instance de la classe externe. Une seule instance de la classe externe peut lui avoir associé plusieurs instances de la classe interne. Comme une instance d'une classe interne non statique a une instance associée de la classe externe, les méthodes de la classe interne peuvent accéder directement à l'un des membres (champs ou méthodes) de l'instance de classe externe. Par exemple, la méthode de test définie ci-dessus peut accéder directement à a et à b directement

Une classe définie dans une autre classe est appelée une classe imbriquée. Comme les autres membres d'une classe, une classe imbriquée peut être déclarée statique ou non. Une classe imbriquée non statique est appelée une classe interne. Une instance d'une classe interne ne peut exister que dans une instance de sa classe englobante et a accès aux membres de sa classe englobante même si elle est déclarée privée. Le tableau suivant indique les types de classes imbriquées:

Types de emboîtées Classes de type Portée intérieure membre de classe imbriquée statique pas intérieure classe [non statique] Membre de classe oui classe locale locale oui anonyme uniquement le point où il est défini oui

+0

Vous m'avez battu :) –

+0

peut-être vous devriez donner la source du texte copié: http://java.sun.com/docs/books/tutorial/java/javaOO/summarynested.html – echox

0

Bien que ce n'est pas une réponse à votre question, mais assurez-vous que vous êtes au courant du modificateur "statique" des classes internes.

public class Stuff { 
public static class SubStuff { 
    //private or protected 
} 
} 

est différent de celui-ci:

public class Stuff { 
public class SubStuff { 
    //only private 
} 
} 

Si vous avez une classe interne statique que vous voudrez peut-être des variables protégées, les méthodes protégées ainsi de suite. Mais pour les classes internes qui ne sont pas statiques en général, vous voulez que tout soit privé.

Google pour la différence.