[JAVA] Classe imbriquée (pour moi)

1. Qu'est-ce qu'une classe imbriquée?

Vous pouvez définir plus de classes dans la définition de classe, et le nom est appelé classe imbriquée.

1-1. Caractéristiques

Il est simple et facile à lire, et son utilisation est limitée, il est donc courant de l'appliquer à des classes qui veulent cacher leur existence de l'extérieur.

1-2. Types de classes imbriquées

Les classes imbriquées sont divisées dans les types suivants.

1-3. Règles de classe imbriquées

static/Non statique commun -Le même nom de classe que la classe externe ne peut pas être utilisé
-Les modificateurs d'accès peuvent être utilisés.
· Abstrait/Vous pouvez utiliser le modificateur final.
classe statique uniquement ・ Non statique/Peut avoir des membres statiques
-Impossible d'accéder aux variables d'instance définies dans la classe externe
Classes non statiques uniquement -Ne peut pas avoir de membres statiques
-Vous pouvez accéder aux variables d'instance définies dans la classe externe.

1-4. Compilation de classes imbriquées

Nom de classe externe$Nom de classe imbriqué.class

1-5. Accès aux classes imbriquées

Les membres d'une classe imbriquée peuvent être utilisés en instanciant la classe imbriquée. Il peut être instancié par la méthode suivante. [(1) Intégrer une classe imbriquée avec une classe externe](# 1-5-1-Instant une classe imbriquée avec une classe externe) [② Incorporer une classe imbriquée dans une méthode de classe externe](# 1-5-2-Instant une classe imbriquée dans une méthode de classe externe)

1-5-1. Instanciez une classe imbriquée avec une classe externe

【syntaxe】 ・ Pour la classe interne (classe non statique)


/***Nom de classe externe.Nom de classe interne Nom de variable=
**nouveau nom de classe externe().nouveau nom de classe interne();
*/
Outer.Inner obj = new Outer().new Inner();

・ Pour la classe statique


/***Nom de classe externe.nom de la classe statique nom de la variable=
**nouveau nom de classe externe.nom de classe statique();
*/
Outer.StaticInner obj = new Outer.StaticInner();

1-5-2. Instanciez une classe imbriquée dans une méthode de classe externe

Un exemple d'instanciation d'une classe imbriquée dans la méthode main de la classe externe et d'appel des membres définis dans la classe imbriquée.


class Outer{
  private int id = 100;

  class Inner {  //la méthode statique ne peut pas être définie
    public int id = 200;
  //static void hogehoge(){...} //Erreur de compilation
    void method(int id){
      System.out.println("Local_scope_id" + id);
      System.out.println("Inner_scope_id" + this.id);
      System.out.println("Outer_scope_id" + Outer.this.id);
    }
  }

  static class Staticinner {  //Inaccessible aux membres d'instance externes
    public static int id = 300;
    static void method(int id){
      System.out.println(id);
      System.out.println(Staticinner.id);
    //System.out.println(Outer.this.id);  //Erreur de compilation
    }
  }

  public static void main(String... args){
  //Instanciation et appel de classe interne
    new Outer().new Inner().method(400);
  //new Inner().mehod(400);  //Erreur de compilation

    System.out.println();

  //Instanciation et appel de classes statiques
    new Outer.Staticinner().method(500);  //Syntaxe de base
    new Staticinner().method(600);  //Le nom de classe externe peut être omis
    Outer.Staticinner.method(700);  //nouveau en option
    Staticinner.method(800);        //new,Le nom de classe externe peut être omis
  }
}

1-6. Imbrication dans des interfaces et des classes abstraites + autres

Les classes imbriquées vous permettent également de définir des interfaces et des classes abstraites


class Sample{
//Hériter
  abstract class A {abstract void foo();}
  class B extends A {void foo(){}}
//La mise en œuvre est également OK
  interface X {void hoge();}
  class Y implements X {public void hoge(){}}
/*Chacun des éléments ci-dessus peut être donné statique.
Cependant, si la classe abstraite interne est héritée par une classe statique, une erreur de compilation se produira.(Il n'y a aucun problème d'implémentation de l'interface interne avec une classe statique)
Bien sûr, statique → statique est également OK.
*/
}

Vous pouvez également définir des classes imbriquées dans des interfaces et des classes abstraites. Les classes imbriquées peuvent également être définies ...

2. Classe locale

Une classe définie dans une méthode d'une certaine classe.

2-1. Caractéristiques

-Valide uniquement dans la méthode (gérée localement). -Comme il est traité localement, les modificateurs d'accès et les statiques ne peuvent pas être utilisés. (Autrement dit, seules les classes non statiques peuvent être définies)

2-2. Règles de classe locales

Classe locale ・ Modificateur d'accès(public,protected,private)Ne peut pas être utilisé
・static修飾子Ne peut pas être utilisé
-Le modificateur abstrait et le modificateur final peuvent être utilisés.
-Vous pouvez accéder aux membres de la classe externe.

· Pour accéder aux arguments de méthode et aux variables locales de la classe externe à partir de la classe locale, chaque variable est définitive(constant)Doit. Par conséquent, il était nécessaire d'ajouter explicitement le modificateur final jusqu'à SE7, mais depuis SE8, final est implicitement ajouté, donc aucun ajout explicite n'est requis.(En d'autres termes, c'est une variable pratiquement finale)

2-2. Exemple de code pour la classe locale


//Seules les variables locales sont effectivement définitives

class Outer{
  private static int a = 1;  //variable statique
  private int b = 2;  //Variable d'instance
  void methodOuter(int c, final int d){
    final int e = 5; int f = 6;
    class Local{
      void methodLocal() {
        System.out.println(a + "" + b + c + d + e + f);
      //c = 100;Erreur de compilation
      //d = 200;Erreur de compilation
      }
    }
    a = 10;  //OK
    b = 20;  //OK
  //e = 300;Erreur de compilation
  //f = 400;Erreur de compilation
    new Local().methodLocal();
  }

  public static void main(String... args){
    Outer obj = new Outer();
    obj.methodOuter(3, 4);
  }
}

//Résultat d'exécution
10203456

[▲ Revenir à la sélection](type de classe # 1-2-Nest)

3. Classe anonyme

Une classe dans laquelle la définition de classe et l'instanciation sont décrites comme une seule expression sans spécifier le nom de la classe.

3-1. Caractéristiques

-En fait, c'est une sous-classe d'une certaine classe ou d'une classe qui implémente une certaine interface, et le processus (méthode) à remplacer après "nouvelle super classe" ou "nouvelle interface" est décrit dans le bloc. -La classe anonyme est définie comme une expression, donc un point-virgule est requis à la fin. -Utiliser lorsque vous n'avez pas besoin de le réutiliser et que vous souhaitez l'implémenter uniquement dans un emplacement spécifique. Par conséquent, la définition de classe et l'instanciation sont effectuées en même temps sans déclarer le nom de la classe. -Les expressions Lambda qui peuvent être utilisées dans les interfaces fonctionnelles mais qui sont faciles à décrire sont les

3-2. Règles de classe anonymes

Classe anonyme ・ Modificateur d'accès(public,protected,private)Ne peut pas être utilisé
・ Impossible d'utiliser le modificateur statique
・abstract修飾子、final修飾子Ne peut pas être utilisé
· Peut accéder aux membres des classes externes
· Peut accéder aux arguments de méthode et aux variables locales de la classe externe(Cependant, finale implicite)
-Impossible de définir le constructeur

3-3. Exemple de définition de classe anonyme

・ Pas de stockage d'objets


class Sample1{
  private String name1 = "piyoko";  //Réaffectable
  void method(String name2){  //Ne peut pas être réaffecté
    new MyInter(){
      public void piyo(){
        System.out.println(name1 + " & " + name2);
      }
    }.piyo();
  }
  public static void main(String... args){
    new Sample1().method("piyota");
  }
}

interface MyInter{
  void piyo();
}

・ Avec stockage d'objets


class Sample2{
  public static void main(String... args){
    MyInter obj = new MyInter() {
      public void hoge(String name) {
        System.out.println(name);
      }
    };
    obj.hoge("hogeta");
  }
}

interface MyInter{
  void hoge(String name);
}

//Pour le type lambda
MyInter obj = (name) -> {System.out.println(name);}; //Veillez à ne pas oublier d'ajouter un point-virgule lorsque vous placez entre parenthèses
MyInter obj = name -> System.out.println(name);

//Référence de la méthode
MyInter obj = System.out::println;

[▲ Revenir à la sélection](type de classe # 1-2-Nest)

Les références

・ [Oracle Certification Textbook Java Programmer Gold SE 8 (EXAMPRESS)](https://www.amazon.co.jp/%E3%82%AA%E3%83%A9%E3%82%AF%E3%83] % AB% E8% AA% 8D% E5% AE% 9A% E8% B3% 87% E6% A0% BC% E6% 95% 99% E7% A7% 91% E6% 9B% B8-Java% E3% 83 % 97% E3% 83% AD% E3% 82% B0% E3% 83% A9% E3% 83% 9E-Gold-SE-EXAMPRESS / dp / 479814682X)

fin

Recommended Posts

Classe imbriquée (pour moi)
[Java] Classe imbriquée
[Pour moi-même] Transfert du traitement de classe de servlet
Collection Gradle TIPS (pour moi)
Activez OpenCV avec java8. (Pour moi-même)
java (utilisez le type de classe pour le champ)
Mémo d'exécution Docker compilé pour moi
Consulter les notes de la classe java.util.Scanner
Paramètres d'exécution des programmes CGI localement (pour moi-même)
Une note de révision pour la classe java.util.Objects
Façonnez la classe de cas Scala pour qu'elle soit facile à voir