Examen de la classe interne Java

"Classe interne Java", Je le savais de façon inattendue, mais il y avait de nombreux endroits que je ne connaissais pas, alors passons en revue.

Qu'est-ce qu'une classe intérieure?

Comme le mot le dit, c'est une classe à l'intérieur de la classe.

Utilisation en classe intérieure

En tant qu'application, il offre une meilleure dissimulation (encapsulation). Les classes qui n'ont aucun sens en dehors de la classe externe peuvent être cachées à l'intérieur. 例:Cow.javaとCowLeg.java

Classification des classes internes

  1. Les classes internes non statiques sont associées aux instances de classe __outer __
  2. La classe interne statique est liée à la classe __outer __
  3. La classe interne locale est liée à la méthode __ __

Lequel est pertinent est très important et Il s'est avéré que l'utilisation était décidée.

Caractéristiques des classes internes non statiques

Il est traité de la même manière que les champs, méthodes, constructeurs, etc. non statiques de classes externes. ⇒ Éléments qui ne peuvent être utilisés que si l'instance existe.

Privé et protégé peuvent être utilisés même s'il s'agit d'une classe

(Vous pouvez également ajouter statique, mais ce sera une classe interne statique, donc plus tard)

private,visibilité protégée


public class Outer {
    public class PublicInner {}
    private class PrivateInner {}
    public class PackagePrivateInner {}
}
  1. L'unité supérieure de la classe est package, et public et package private sont suffisants.
  2. Puisque l'unité supérieure de la classe interne non statique est la classe externe, toute visibilité peut être utilisée.

L'intérieur peut voir l'extérieur, mais l'extérieur ne peut pas voir l'intérieur

Visibilité


public class Outer {
    private int outerVal;

    public class Inner {
        public int innerVal;
        private void method() {
            // OK
            this.innerVal = Outer.this.outerVal;
        }
    }

    private void method() {
        // NG
        // this.outerVal = innerVal;
    }
}

Les classes internes non statiques sont associées aux instances de classe __outer __, donc

  1. "Il y a une instance de classe interne non statique = il y a une instance de classe externe" ⇒ Vous pouvez voir l'extérieur de l'intérieur
  2. "L'instance de classe externe existe. L'instance de classe interne non statique existe." ⇒ L'intérieur n'est pas visible de l'extérieur

Instanciation de classe interne non statique

Instanciation de classe interne non statique


Outer.Inner inner = (new Outer()).new Inner();
  1. (new Outer ()) -> Instance de classe externe
  2. Classe externe .new Inner () -> Instanciation d'une classe interne non statique à l'intérieur d'une instance de classe externe

Les instances de classe interne non statiques sont exposées à des classes externes

Accès depuis une classe externe


public class Outer {
    private int outerVal;

    public class Inner {
        private int privateA = 1;
        protected  int protectedB = 2;
        public int publicC = 3;
    }

    private void method() {
        Inner inner = new Inner();

        System.out.println(inner.publicC);
        System.out.println(inner.protectedB);
        System.out.println(inner.privateA);
    }
}

Accès depuis d'autres classes


public static void main(String[] args) {
    Outer.Inner inner = new Outer().new Inner();
    System.out.println(inner.publicC);
    System.out.println(inner.protectedB);
    
    // NG
    // System.out.println(inner.privateA);
}

Instances de classe interne

  1. Même privé peut être vu de la classe externe
  2. La visibilité fonctionne à partir d'autres classes

Pourquoi vous pouvez voir Inner private de __Outer: __ inner-private.png

Outer$Inner@461 Je comprends qu'Inner n'est pas indépendant, mais fait partie d'Outer. Par conséquent, puisqu'il est dans la même classe, Private of Inner peut également être vu dans Outer. La même chose était vraie pour les classes internes statiques.

__ Je recherche une meilleure interprétation! !! !! __

champ statique, méthode, bloc ne peuvent pas être utilisés

Erreur de compilation: 「Inner classes cannot have static declarations」

le membre statique est NG


public class Outer2 {
    public class Inner {
        static { /** something **/ }
        public static int staticValue;
        public static void staticMethod() { /** something **/ }
    }
}

Les classes internes non statiques sont associées aux instances de classe __outer __, donc 1.Puisque la statique sert à s'associer à une classe, pas à une instance Erreur de compilation car elle est incohérente en termes de grammaire

Priorité variable

Priorité variable


public class Outer {
    String a = "outer-a";
    String b = "outer-b";
    String c ="outer-c";

    public class Inner {
        String a = "inner-a";
        String b = "inner-b";
        private void method() {
            String a = "method-a";

            System.out.println(a);
            System.out.println(b);
            System.out.println(c);

            System.out.println(this.a);
            System.out.println(Outer.this.a);
        }
    }

    public static void main(String[] args) {
        new Outer().new Inner().method();
    }
}
method-a
inner-b
outer-c
inner-a
outer-a

La priorité des classes internes non statiques est

  1. Variable locale dans la méthode
  2. Variables d'instance de classe interne
  3. Variables d'instance de classe externes

Vous pouvez spécifier la plage de variables avec this.variable, Outer.this.variable. var-priority.png Vous pouvez voir à partir de cette figure cachée! !!

Caractéristiques de la classe interne statique

C'est comme une classe ordinaire! !! Cependant, il a également ses propres caractéristiques en tant que classe interne.

Privé et protégé peuvent être utilisés même s'il s'agit d'une classe

Comme les classes internes non statiques, le niveau supérieur est une classe, donc privé et protégé peuvent être utilisés.

L'instance de classe interne statique est complètement visible depuis la classe externe

Parce qu'il appartient à la classe externe ainsi qu'à la classe interne non statique.

Instanciation de classe interne statique

Instanciation de classe interne statique


Outer.Inner inner = new Outer.Inner();
  1. nouvelle classe externe. Peut être générée par la classe interne statique ()

classe interne locale

python


public static void main(String[] args) {
    class Inner {
        protected int a = 1;
    }
    class InnerSub extends Inner {
        private int b = 2;
    }
    InnerSub sub = new InnerSub();
    System.out.println(sub.a + sub.b);
}
  1. Tout comme private et protected ne sont pas nécessaires pour les variables locales, __visibility ne peut pas être utilisé __
  2. __static ne peut pas être utilisé car il est lié à la méthode __

Résumé

  1. Lorsque vous utilisez une classe interne, il est important de clarifier __ "à quoi (classe, instance, méthode) vous voulez associer" __.
  2. En règle générale, il est recommandé que la classe interne soit statique. La raison principale est que les classes internes non statiques référencent implicitement des instances de classes englobantes (classes de niveau supérieur). (Sécurité ??) "ce $ 0"

inner-private.png

À partir de Effective Java 2nd Edition (The Java Series)

Recommended Posts

Examen de la classe interne Java
Méthodes de classe Java
[Java] Héritage de classe
classe Scanner java
Classe Java HashMap
java (classe abstraite)
[Java] Classe imbriquée
Classe anonyme Java
À propos de la classe Java
[java] Classe abstraite
[Java] Classe d'objets
Classe locale Java
java IO examen
À propos de la division de classe (Java)
À propos de la classe Java StringBuilder
NIO.2 examen de Java
Avis sur Java Shilber
[Java] À propos de la classe Singleton
Notes de révision de Java NIO 2
Exemple d'utilisation de classe interne
Champ de type de classe Java
Programmation Java (méthode de classe)
À propos de la classe Java String
Un examen rapide de Java appris en classe
Consultez les annotations Java maintenant
Examen NIO de Java
Programmation Java (structure de classe)
Évaluer java8 ~ Type Lambda ~
À propos de la classe abstraite de Java
Un examen rapide de Java appris en classe part4
Un examen rapide de Java appris en classe part3
Un examen rapide de Java appris en classe part2
[Java] Référence de classe de wrapper Integer
Sous-chaîne de mémo Java (classe standard)
Astuces Java - Modificateurs de classe StaticUtility
Révision et résumé de Progate Java (débutant)
Sous-chaîne de classe Java inflexible String
Longueur du mémo Java (classe standard)
[Implémentation] Notes de classe de processus java
Notes de révision de Java Collections Framework
À propos des types de chargeur de classe Java
[Java] Comparateur de la classe Collection
Définition et instanciation de classe Java
Mémo d'apprentissage Java (classe abstraite)
Résumé de la classe Java Math
[Java] Qu'est-ce que l'héritage de classe?
Méthode de classe variable de classe Java
[Notions de base Java] Qu'est-ce que la classe?
Créer une classe immuable avec JAVA
Pourquoi les variables de classe sont-elles nécessaires? [Java]
Appeler la classe scellée de Kotlin depuis Java
[Java] Syntaxe orientée objet - Méthode / argument de classe
Diverses méthodes de la classe Java String
[Java] Mémo pour nommer les noms de classe
Comment désassembler un fichier de classe Java
Classe Kotlin à envoyer aux développeurs Java
Classe StringBuffer et StringBuilder en Java
Comment décompiler un fichier de classe Java
java (utilisez le type de classe pour le champ)
Java