Classes internes Java
1. Signification
Dans le langage de programmation Java, les programmes sont construits à partir de classes. Les classes peuvent également être déclarées à l'intérieur d'une classe, et nous appelons une telle classe de classe intérieure.
2. Fonction
• Implémentation d'une meilleure encapsulation, nous savons que les modificateurs d'accès pour les classes ordinaires (classes non interner) ne peuvent pas être privées ou protégées, tandis que les classes intérieures peuvent. Lorsque nous déclarons la classe intérieure comme privée, seule la classe extérieure peut accéder à la classe intérieure, cachant bien la classe intérieure.
• Les classes intérieures peuvent hériter (étendre) ou implémenter (implémente) d'autres classes ou interfaces sans être affectées par des classes externes.
• Les classes intérieures peuvent accéder directement aux champs et aux méthodes des classes externes, même si elles sont modifiées avec privé. Au contraire, les classes externes ne peuvent pas accéder directement aux membres des classes internes.
3. Principe
Les classes internes sont un concept de temps de compilation. Après la compilation, deux fichiers de classe indépendants seront générés, comme suit:
classe publique extérieure {chaîne privée outername = "exter"; classe inner {private String InnerName = "Inner"; }}Le fichier compilé est le suivant:
Après la compilation, l'extérieur est renommé vers l'intérieur de $, et la période (.) Est remplacée par le signe du dollar ($).
Iv. Classification
Les classes internes Java peuvent être divisées en classes internes membres, classes internes locales, classes internes anonymes et classes internes statiques.
1) Classe interne de membres
Une classe interne membre peut être considérée comme un membre d'une classe externe. Un membre statique ne peut pas être déclaré dans une classe interne de membre, mais le champ final statique est une exception. Nous savons que lorsqu'une classe est chargée, les membres statiques seront initialisés en premier. Si la classe interne du membre a des membres statiques, la classe intérieure sera générée avant la classe externe. La classe intérieure sert la classe externe et la classe intérieure générée avant la classe externe peut être hors de contrôle. Lors de l'instanciation d'une classe intérieure de membre, la classe intérieure du membre tiendra une référence à l'objet actuel de la classe externe, afin que les membres de la classe externe puissent être directement accessibles dans la classe intérieure du membre, même si privé est modifié.
importer statique java.lang.system.out; classe publique extérieure {chaîne privée outername = "exter"; // La classe externe ne peut pas accéder directement aux membres de la classe intérieure et doit instancier l'objet de classe interne privé intérieur intérieur = new inner (); classe publique inner {private String InnerName = "Inner"; public void show () {out.println (outername); // Vous pouvez accéder directement aux membres de la classe extérieure}} public void show () {out.println (inner.innername); inner.show (); } public static void main (string [] args) {exter = new ulter (); exter.show (); // Instancier la classe intérieure exter.inner inner = outer.new inner (); inner.show (); }}Résultats en cours:
intérieur
extérieur
extérieur
La référence à l'objet de classe externe de la classe interne membre est composée du nom de la classe externe avant cela. Cette forme est appelée
Limited-this, out.println (outername) et out.println (exter.this.outername) sont équivalents.
2) classes internes locales
L'utilisation de classes intérieures locales est essentiellement la même que celle des classes intérieures des membres. C'est juste que les classes intérieures locales sont définies dans les méthodes de la classe externe, tout comme les variables locales, et ne sont pas membres de la classe externe. Une classe intérieure locale est inaccessible en dehors de la méthode, mais ses instances peuvent être renvoyées de la méthode et les instances resteront jusqu'à ce qu'elles ne soient plus référencées. Les classes internes locales peuvent également accéder aux variables locales, aux paramètres de la méthode, etc. de la méthode qu'ils sont localisés. La limitation est que les variables locales ou les paramètres de méthode ne sont accessibles que lorsqu'ils sont déclarés finaux.
importer statique java.lang.system.out; classe publique extérieure {chaîne privée outername = "exter"; public void show (final string str) {// Les paramètres de méthode sont la classe de type final inner {public void print () {out.println (outername + str); }} Inner inner = new Inner (); inner.print (); } public static void main (string [] args) {exter = new ulter (); exter.show (": lalala"); }}Résultats en cours:
Extérieur: Lalala
3) classe interne anonyme
Vous pouvez imaginer des classes internes anonymes en tant que classes internes locales sans noms de classe. Les classes internes anonymes ont les caractéristiques suivantes:
1. Les classes internes anonymes ne peuvent pas avoir de constructeurs. Les classes internes anonymes n'ont pas de noms de classe, donc le constructeur ne peut pas être déclaré.
2. Les classes internes anonymes doivent hériter ou implémenter une interface. Le type attribué à nouveau est le supertype de la classe anonyme. Les classes anonymes ne peuvent pas avoir des étendues ou des implémentés les clauses affichées, et ils ne peuvent pas non plus de modificateurs.
3. Les classes internes anonymes sont les mêmes que les classes internes des membres et les classes internes locales, et les membres statiques ne peuvent pas être déclarés.
importer statique java.lang.system.out; classe publique extérieure {chaîne privée outername = "exter"; public void show (final string str) {new Inner () {// implémenter l'interface intérieure publique void print () {out.println (outername + str); } }.imprimer(); } public static void main (string [] args) {exter = new ulter (); exter.show (": lalala"); }} interface inner {void print (); }Résultats en cours:
Extérieur: Lalala
4) classe interne statique
La classe intérieure statique, également appelée classes imbriquées dans certains livres, nécessite l'utilisation de modificateurs statiques lors de la déclaration. La classe intérieure statique est différente des trois premières classes intérieures. La classe intérieure statique ne contient pas de références à l'objet actuel de la classe extérieure, donc les membres non statiques de la classe extérieure ne sont pas accessibles dans la classe intérieure statique. On peut dire que la classe intérieure statique ne dépend pas de la classe extérieure.
importer statique java.lang.system.out; classe publique extérieure {chaîne privée outername = "exter"; INT INT STATIQUE privé = 123; Inner intérieur privé = new inner (); classe statique publique inner {public void print1 () {//out.println(outerName); Un membre non statique de la classe externe ne peut pas être accessible out.println (id); } public static void print2 () {out.println (id); }} public void show () {inner.print1 (); } public static void main (string [] args) {exter = new ulter (); exter.show (); Outer.inner.print2 (); // Accédez à la classe intérieure statique via le nom de classe}}