Il existe 4 formes de classes internes Java que nous utilisons généralement: classes internes générales, classes internes locales, classes internes anonymes et classes internes statiques. Ce qui suit est un test que j'ai fait pour illustrer les caractéristiques de diverses classes internes.
En ce qui concerne les caractéristiques des classes internes, le code est expliqué en détail, comme suit.
/ ** Test de classe interne Java * * Résultat de réflexion interobj: * * private int i * private interobj $ intera ia * public interobj () * public static void main (java.lang.string []) * private int gesi () * public void p () * public void pi () * public void pp () * public static void ppp () * public void pp () public void pppp () * Vous trouverez ci-dessous le compilateur généré automatiquement des méthodes statiques pour accéder aux attributs privés ou au niveau du package de méthode * Static int Access 0 0 (interobj) * / public class interobj {private int i = 8; private intera ia = null; public interobj () {ia = new intera ();} private int geti () {return i;} public void p () {pi (); pp (); ppp (); pppp (); pppp ();} / * * dans les classes, méthodes et propriétés internes générales sont accessibles à n'importe quel niveau de la "classe de couche". La classe de veste peut également * accéder aux méthodes et propriétés à n'importe quel niveau de la "classe interne". Parce que la classe intérieure peut maintenir une référence à l'objet de classe Coat. * Pour les méthodes et attributs privés qui doivent être accessibles par la classe interne, le compilateur générera automatiquement les méthodes statiques de niveau "package" correspondant aux * méthodes et attributs privés. Ces méthodes doivent utiliser l'objet de classe externe comme paramètre *, afin que vous puissiez accéder aux méthodes privées et aux * attributs de la classe extérieure dans les méthodes statiques de niveau "package". * Le même principe est le même pour la classe de veste pour accéder aux méthodes et propriétés privées dans la classe intérieure. Lorsque la classe intérieure est compilée, * générera une méthode statique de niveau "package" correspondant aux méthodes et propriétés privées qui doivent être accessibles par la classe de veste. * * Intera Reflection Result: * private int ia * ci-dessous est la référence de l'objet de classe Coat détenu par la classe interne * InterObj final Ce 0 0 * Utilisez l'objet de classe Coat comme paramètre dans le constructeur * InterObj $ intera (interobj) * privé void PA () * pa1 () * * / class Intera {private int ia = 9; private void pa () {System.out.println ("Ceci est intera.pa: ia =" + ia + ", interobj.i =" + geti ());} public void pa1 () {System.out.println ("Ceci est intera.pa1: ia = "+ ia +", interobj.i = "+ geti ());}} / * * Les classes internes locales ne sont visibles que des méthodes à l'intérieur, et d'autres fonctionnalités sont les mêmes que les classes internes générales. * Pour les variables locales qui doivent être accessibles, il doit être défini sur final, car bien que la classe intérieure locale puisse contenir * des références à l'objet de classe extérieure pour accéder aux propriétés et méthodes, il ne peut pas accéder aux variables locales dans la méthode de classe externe. Tous les compilateurs "copiernt" une copie des variables locales qui doivent être accessibles dans la classe intérieure locale (mais il n'y a pas de copie pour les types dont les types de base int, float et string * ne sont pas modifiés). Afin de s'assurer que la valeur de variable copiée et l'objet * pointé par la valeur de la variable dans la méthode externe sont le même objet, il est nécessaire que les variables locales utilisées par la classe locale soient définies sur final et ne peuvent pas être modifiées *, afin de garantir que les variables copiées dans la partie locale et les variables dans la méthode externe pointe du même objet. Définition de la variable * sur les contrôles finaux uniquement que l'adresse d'objet pointée par la variable reste inchangée, plutôt que les propriétés internes de l'objet pour lesquelles il pointe ne peut pas être modifiée. * * Réflexion Résultat de l'interb: * * private int ib * Vous trouverez ci-dessous la référence de l'objet de classe Coat détenu par la classe interne * InterObj final Ce 0 0 * Ci-dessous est la copie de référence de l'objet de test de variable local dans l'objet de la classe de manteau et le test variable local comme paramètres de la classe privée * Interobj $ 1 $ Interb (interobj, test) the compiler automatically generates a static method for accessing private properties or method package level* static void access$0(InterObj$1$InterB) */public void pi(){final int s=5;final Test test=new Test();class InterB{private int ib=7;private void pB(){System.out.println("this is InterB.pB: ib="+ib+ ", (Méthode) pi.s =" + s + ", test.t =" + test.gett ());}} interb ib = new interb (); // Ceci est modifié l'état interne du test de test référencé par la classe interne locale. // Lorsque le résultat est appelé ib.pb (), la sortie est la valeur modifiée 100Test.sett (100); ib.pb ();} / * * classe interne statique, utilisée lorsqu'il n'est pas nécessaire de maintenir une référence à "l'objet de classe de couche". * * Résultat de la réflexion Inter: (La classe interne statique n'a pas de référence à l'objet de classe Coat) * Int privé * Inter () * private void pc () * / static class Inter {private int ic = 6; private void pc () {System.out.println ("Ceci est interc.pc: ic =" + ic);}} / * * non statique, vous pouvez construire des classes statiques et non statiques. * Vous pouvez accéder à toutes les autorisations dans la classe intérieure * / public void pp () {intera ia = new Intera (); ia.pa (); ia.pa1 (); interc = new Inter (); ic.pc (); // les classes internes locales ne sont que visibles à l'intérieur de la méthode // interb ib = new interb ();} / * * les méthodes statiques ne peuvent que les classes internes statiques ne peuvent que construire les classes interne. * Vous ne pouvez pas construire des classes intérieures non statiques car il n'y a pas d'objet dans la méthode statique qui fait référence à la "classe Coat" pour construire * l'objet de classe intérieure qui doit être référencé par l'objet de classe Coat. * / public static void ppp () {// intera ia = new interA (); // mais il peut être construit comme suit: interobj iobj = new interobj (); intera ia = ioBj.new intera (); ia.pa (); ia.pa1 (); interc = new inter (); ic.pc (); // classes internes, interne à l'intérieur //in ib = new Interb ();} / * * Test de classe interne anonyme * / public void pppp () {TestInterface TIF = new TestInterface () {public void pppp () {System.out.println ("TestInterface.Noname");}}; Tif.pppp ();} / * * ib = 7, (méthode) pi.s = 5, test.t = 100 * Ceci est intera.pa: ia = 9, interobj.i = 8 * Ceci est intera.pa1: ia = 9, interobj.i = 8 * Ceci est interc. Ceci est Interc.pc: ic = 6 * TESTINTERFACE.NONAME * / public static void main (String [] args) {interobj io = new interobj (); io.p ();}} / ** interface pour créer des classes internes * / interface Tesinterface gett () {return t;} public void sett (int t1) {t = t1;}}Permettez-moi de partager un autre exemple:
classe publique InnerClass {Static Toy Toy = new Toy () {String Name = "Lao Wu"; @ Override public void Jump () {System.out.println (Name + "Breaking Of The Earth"); go ();}}; / * classe intérieure: classe définie à l'intérieur de la classe * 1. Classe interne du membre: * 1.1 La classe interne des membres peut accéder directement aux propriétés de la classe externe * 1.2 Accédez à l'objet actuel de la classe externe via le nom de classe externe. De cette façon * membre de classe interne objet instancié: nom de classe externe. Nom de classe interne Nom de référence = Classe externe Object.New Nom de classe interne (); * 2. Classe intérieure statique * 2.1 Les ressources membre de la classe externe ne sont pas accessibles à l'intérieur de la classe intérieure statique et ne peuvent accéder aux ressources statiques de la classe externe via le nom de classe * Objet d'instanciation de classe interne statique: nom de classe externe. Nom de classe interne Nom de référence = nouveau nom de classe externe. Nom de classe interne (); * 3. Classe intérieure locale: * 3.1 Vous pouvez également accéder directement aux propriétés de la classe externe * 3.2 Vous pouvez également accéder à l'objet actuel de la classe externe * 3.3 La classe intérieure locale ne peut être accessible que dans la méthode, et le modificateur ne peut être que la valeur par défaut * 4. Classe intérieure anonyme: Lorsqu'une instance de sous-classe spécifique d'une classe est nécessaire, une classe est temporairement générée à l'aide de * nouveau nom de classe () {* Méthode d'écrasement; *}; * 4.1 La classe intérieure anonyme accède aux propriétés de la méthode externe, et cette propriété sera convertie en une constante * 4.2 nouveaux attributs et méthodes ajoutés dans la classe intérieure anonyme, et ne peuvent être utilisés qu'à l'intérieur de la classe intérieure anonyme ** / public static void Main (String [] args) {Person per = new Person (Lao Chen ", 18); personne. Computer ("Alien"); personne.Comp-dieu PC1 = new Person ("Jian Zihao", 18) .New Computer ("Alien"); pc.Rungame (); PC1.Rungame (); Person.Chatter1 PC11 = new Person.Computer1 ("Internet Cafe Computer"); pc11.rungame (); Per.USEComputer (); String Str = "LALALA"; "Rokudou"; ordinateur com = nouvel ordinateur () {@ Override public void rungame () {// todo atened methody Stubsystem.out.println (per.age + "annomy" + per.name + "Playing Lalalala Demasita"); system.out.println (Str);}}; com.rungame (); // anonys Classes / * Toy Toy = new Toy () {@Override public void Jump () {System.out.println ("Breaking Out of the Earth"); }}. playgame () {System.out.println (nom + "jeu jeu");} classe publique ordinateur {nom de chaîne; ordinateur public (nom de la chaîne) {super (); this.name = name;} public void rungame () {System.out.println (nom + "run jeu"); System.out.println (âge + "annex static class Computer1{String name;public Computer1(String name) {super();this.name = name;}public void runGame(){System.out.println(name+"run game");System.out.println(Person.age1+""+Person.name1+"playing game");}}public void useComputer(){class Computer{String name;public Computer(String name) {super (); this.name = name;} public void rungame () {System.out.println (name + "run jeu"); System.out.println (personne.This.age + "" + person.This.name + "playing game");}} Computer Com = nouveau ordinateur ("bookbook"); Com.rungame ();}} Interface publique Computer {VOID rungame ();} public class Toy {public void Jump () {System.out.println ("Jump Toy");}}Résumer
Ce qui précède est toute l'explication détaillée du code de test interne Java dans cet article, j'espère que cela sera utile à tout le monde. Les amis intéressés peuvent continuer à se référer à d'autres sujets connexes sur ce site. S'il y a des lacunes, veuillez laisser un message pour le signaler. Merci vos amis pour votre soutien pour ce site!