Java Inner Class, un concept similaire se trouve également dans C ++, c'est-à-dire la classe imbriquée. À première vue, les classes internes peuvent sembler un peu redondantes, et leur utilité peut ne pas être si importante pour les débutants, mais avec une compréhension approfondie de celle-ci, vous constaterez que les concepteurs de Java sont en effet bien intentionnés dans les classes internes. Apprendre à utiliser des classes internes fait partie de la maîtrise de la programmation avancée Java, qui vous permet de concevoir plus élégamment votre structure de programme. Les éléments suivants sont introduits à partir des aspects suivants:
Première réunion
Contenu de l'interface publique {int Value ();} Interface publique Destination {String readLabel ();} public class Goods {private class Content implémente contente {private int i = 11; public int value () {return i; }} Classe protégée GDESTINATION Implémente la destination {Étiquette de chaîne privée; GDESTINATION PRIVATE (String WHERETO) {Label = WHERO; } public String readLabel () {return label; }} Public Destination dest (String S) {return new GDESTINATION (S); } contenu public contenu () {return new contenu (); }} classe TestGoods {public static void main (String [] args) {biens p = new boods (); Contenu C = P.Cont (); Destination d = p.dest ("beijing"); }}Dans cet exemple, le contenu des classes et la gdestation sont définis à l'intérieur des produits de classe et ont respectivement protégé et privé les modificateurs pour contrôler le niveau d'accès. Le contenu représente le contenu des marchandises, tandis que la gdestation représente la destination des marchandises. Ils implémentent respectivement deux interfaces et destination. Dans la méthode principale ci-dessous, utilisez le contenu C et la destination D directement pour fonctionner, et vous ne voyez même pas les noms de ces deux classes internes! De cette façon, le premier avantage des classes internes se reflète - masquer les opérations que vous ne voulez pas que les autres sachent, c'est-à-dire l'encapsulation.
Dans le même temps, nous avons également découvert la première méthode pour obtenir des objets de classe interne en dehors de la portée de la classe externe, c'est-à-dire pour utiliser les méthodes de sa classe externe pour créer et retourner. C'est ainsi que les méthodes cont () et dest () dans l'exemple ci-dessus font. Alors, y a-t-il une autre manière? Bien sûr, le format de syntaxe est le suivant:
OUTOROBject = new outerClass (paramètres du constructeur); eterClass.innerClass InnerObject = outerObject.new InnerClass (paramètres du constructeur);
Notez que lors de la création d'objets de classe interne non statiques, vous devez d'abord créer les objets de classe extérieure correspondants. Quant à la raison, cela conduit également à notre prochain sujet
Les objets de classe intérieure non statiques ont des références à leurs objets de classe extérieure
Un peu de modification de l'exemple tout à l'heure:
Goods de classe publique {valorisation privée = 2; Le contenu de classe privée implémente les contenus {private int i = 11 * valoriser; public int value () {return i; }} Classe protégée GDESTINATION Implémente la destination {Étiquette de chaîne privée; GDESTINATION PRIVATE (String WHERETO) {Label = WHERO; } public String readLabel () {return label; }} Public Destination dest (String S) {return new GDESTINATION (S); } contenu public contenu () {return new contenu (); }}La partie modifiée est indiquée en rouge. Ici, nous ajoutons une variable de membre privé pour évaluer à la classe de marchandises, ce qui signifie le coefficient de valeur des marchandises. Multipliez-le lorsque la valeur de la méthode de contenu de la classe interne () calcule la valeur. Nous avons constaté que Value () peut accéder à la valorisation, qui est également le deuxième avantage des classes intérieures - un objet de classe interne peut accéder au contenu de l'objet de classe externe qui l'a créé, même en incluant des variables privées! Il s'agit d'une fonctionnalité très utile qui nous fournit plus d'idées et de raccourcis lors de la conception. Pour implémenter cette fonction, l'objet de classe interne doit avoir une référence à l'objet de classe externe. Lorsque le compilateur Java crée un objet de classe interne, il transmet implicitement la référence à son objet de classe externe et le sauve tout le temps. Cela permet aux objets de classe interne d'accéder à toujours leurs objets de classe externe, c'est également pourquoi en dehors de la portée des actions de classe externes, l'objet de classe externe doit être créé en premier.
Certaines personnes peuvent demander, que se passe-t-il si une variable de membre dans une classe intérieure est la même qu'une variable de membre dans une classe extérieure, c'est-à-dire qu'une variable de membre du même nom dans la classe extérieure est bloquée? C'est bon, Java utilise le format suivant pour exprimer des références aux classes externes:
exterclass.
Avec lui, nous n'avons pas peur de ces situations de blocage.
Classe intérieure statique
Comme les classes ordinaires, les classes intérieures peuvent également être statiques. Cependant, par rapport aux classes internes non statiques, la différence est que les classes intérieures statiques n'ont aucune référence à l'extérieur. Ceci est en fait très similaire aux classes imbriquées en C ++. La plus grande différence entre les classes internes Java et les classes imbriquées C ++ est de savoir s'il existe des références à l'extérieur. Bien sûr, il y a une différence dans le point de vue de la conception et quelques détails.
De plus, dans une classe interne non statique, il ne peut pas y avoir de données statiques, de méthodes statiques ou d'une autre classe interne statique (la classe interne peut être imbriquée plus d'une couche). Cependant, les classes intérieures statiques peuvent avoir tout cela. Il s'agit également de la deuxième différence entre les deux.
Cours internes locaux
Oui, les classes internes Java peuvent également être locales, et elles peuvent être définies dans une méthode ou même un bloc de code.
classe publique Goods1 {Public Destination dest (String S) {class gdeStination implémente la destination {étiquette de chaîne privée; GDESTINATION PRIVATE (String WHERETO) {Label = WHERO; } public String readLabel () {return label; }} Renvoie une nouvelle gdestation (s); } public static void main (String [] args) {biens1 g = news bourse1 (); Destination d = g.dest ("beijing"); }}Ceci est un exemple ci-dessus. Dans la méthode dest, nous définissons une classe intérieure, et finalement cette méthode renvoie l'objet de cette classe intérieure. Cela peut être fait si nous n'avons besoin que de créer l'un de ses objets et de le créer à l'extérieur lors de l'utilisation d'une classe intérieure. Bien sûr, les classes internes définies dans les méthodes peuvent diversifier les conceptions, et le but n'est pas seulement dans ce sens.
Voici un exemple plus bizarre:
public class boods2 {private void internalTracking (boolean b) {if (b) {class Trackingslip {private String id; Trackingslip (String S) {id = s; } String getslip () {return id; }} Trackingslip ts = new Trackingslip ("slip"); String s = ts.getslip (); }} public void track () {internalTracking (true); } public static void main (String [] args) {biens2 g = news gows2 (); g.track (); }}Vous ne pouvez pas créer un objet de cette classe intérieure en dehors de If, car cela dépasse sa portée. Cependant, lors de la compilation, la classe de classe interne est compilée en même temps que les autres classes, mais elle est invalide si elle dépasse cette portée en raison de sa propre portée. En dehors de cela, il n'est pas différent des autres classes intérieures.
Classe interne anonyme
Les règles de syntaxe des classes internes anonymes de Java semblent un peu bizarres, mais comme des tableaux anonymes, lorsque vous n'avez besoin que de créer un objet d'une classe et ne peut pas utiliser son nom, l'utilisation d'une classe interne peut rendre le code concis et clair. Ses règles de syntaxe sont les suivantes:
new interfacename () {......}; ou new SuperClassName () {......};Continuons à donner un exemple:
GRANCES DE CLASSE PUBLIQUE3 {Contenu du contenu public () {return de nouveaux contenus () {private int i = 11; public int value () {return i; }}; }}Ici, la méthode cont () utilise une classe intérieure anonyme pour renvoyer directement un objet qui implémente la classe du contenu de l'interface, qui semble très concise.
Dans l'adaptateur anonyme pour le traitement des événements en Java, les classes intérieures anonymes sont largement utilisées. Par exemple, lorsque vous souhaitez fermer la fenêtre, ajoutez ce code:
frame.addwindowListener (new WindowAdapter () {public void windowClosing (windowEvent e) {System.exit (0);}});Une chose à noter est que puisque la classe intérieure anonyme n'a pas de nom, elle n'a pas de constructeur (mais si cette classe intérieure anonyme hérite d'une classe parent qui ne contient qu'un constructeur avec des arguments, vous devez apporter ces paramètres lors de la création et utiliser le mot-clé super pour appeler le contenu correspondant pendant le processus d'implémentation). Si vous souhaitez initialiser ses variables membre, il existe plusieurs façons:
S'il s'agit d'une classe intérieure anonyme d'une méthode, vous pouvez utiliser cette méthode pour transmettre les paramètres que vous souhaitez, mais n'oubliez pas que ces paramètres doivent être déclarés finaux.
Réformer la classe intérieure anonyme en une classe intérieure locale nommée afin qu'il puisse avoir un constructeur.
Utilisez des blocs de code d'initialisation dans cette classe intérieure anonyme.
Pourquoi les classes internes ont-elles besoin?
Quels sont les avantages des classes internes Java? Pourquoi les classes internes ont-elles besoin?
Tout d'abord, donnons un exemple simple. Si vous souhaitez implémenter une interface, mais qu'une méthode de cette interface a le même nom et les mêmes paramètres qu'une méthode de la classe que vous avez imaginée, que devez-vous faire? À l'heure actuelle, vous pouvez créer une classe interne pour implémenter cette interface. Étant donné que la classe intérieure est accessible à tous les contenus de la classe extérieure, cela peut accomplir toutes les fonctions que vous implémentez directement cette interface.
Mais vous devrez peut-être remettre en question, n'est-ce pas suffisant pour changer la méthode?
En effet, il n'est vraiment pas convaincant de l'utiliser comme une raison de concevoir des catégories internes.
La vraie raison est que les classes internes et les interfaces en Java sont combinées pour résoudre un problème qui est souvent plaint par les programmeurs C ++ - il n'y a plus d'héritage. En fait, la multi-inhérence de C ++ est très compliquée à la conception, et Java peut réaliser l'effet de la multi-inhérence par le biais de classes et d'interfaces internes.
Résumé de la classe interne Java
(1) classe interne non statique définie entre les méthodes:
● Les classes périphériques et internes peuvent accéder à leurs propres membres privés les uns des autres.
● Les variables des membres statiques ne peuvent pas être définies dans la classe intérieure.
De la portée de la classe externe, pour créer un objet de classe interne, vous devez d'abord créer son objet de classe externe
(2) classe interne statique définie entre les méthodes:
● Seuls les membres statiques des classes externes sont accessibles.
La classe intérieure statique n'a pas de références à l'extérieur
(3) classe interne locale définie dans la méthode:
● Cette classe interne n'a aucune autorisation de contrôle d'accès
● La classe périphérique ne peut pas voir la classe intérieure locale dans la méthode, mais la classe intérieure locale peut accéder à n'importe quel membre de la classe périphérique.
● Les classes internes locales sont accessibles dans le corps de la méthode, mais l'instruction d'accès doit être après la définition des classes internes locales.
● Les classes internes locales ne peuvent accéder qu'à des constantes dans le corps de la méthode, c'est-à-dire les membres modifiés avec Final.
(4) classe intérieure anonyme définie dans la méthode:
● Il n'y a pas de constructeur, au lieu de passer les paramètres du constructeur au constructeur Superclass
Lorsque vous n'avez besoin que de créer un objet d'une classe et de ne pas utiliser son nom, l'utilisation de classes intérieures anonymes peut rendre le code concis et clair.
L'article ci-dessus comprend complètement les classes internes et anonymes en Java est tout le contenu que j'ai partagé avec vous. J'espère que cela pourra vous donner une référence et j'espère que vous pourrez soutenir Wulin.com plus.