[JAVA] Verschachtelte Klasse (für mich)

1. Was ist eine verschachtelte Klasse?

Sie können weitere Klassen in der Klassendefinition definieren, und der Name wird als verschachtelte Klasse bezeichnet.

1-1. Funktionen

Es ist einfach und leicht zu lesen, und seine Verwendung ist begrenzt. Daher ist es üblich, es auf Klassen anzuwenden, die ihre Existenz von außen verbergen möchten.

1-2. Arten verschachtelter Klassen

Verschachtelte Klassen werden in die folgenden Typen unterteilt.

1-3 Verschachtelte Klassenregeln

static/Nicht statisch gemeinsam - Der gleiche Klassenname wie die äußere Klasse kann nicht verwendet werden
-Zugriffsmodifikatoren können verwendet werden.
· Abstrakt/Sie können den letzten Modifikator verwenden.
Nur statische Klasse ・ Nicht statisch/Kann statische Elemente haben
- Zugriff auf die in der äußeren Klasse definierten Instanzvariablen nicht möglich
Nur nicht statische Klassen -Kann keine statischen Mitglieder haben
-Sie können auf die in der äußeren Klasse definierten Instanzvariablen zugreifen.

1-4 Verschachtelte Klassenkompilierung

Äußerer Klassenname$Verschachtelter Klassenname.class

1-5 Zugriff auf verschachtelte Klassen

Mitglieder innerhalb einer verschachtelten Klasse können durch Instanziieren der verschachtelten Klasse verwendet werden. Es kann durch die folgende Methode instanziiert werden. [(1) Integrieren Sie eine verschachtelte Klasse in eine äußere Klasse](# 1-5-1-Instanziieren Sie eine verschachtelte Klasse in eine äußere Klasse) [② Integrieren Sie eine verschachtelte Klasse in eine Methode der äußeren Klasse](# 1-5-2-Instant eine verschachtelte Klasse in eine Methode der äußeren Klasse)

1-5-1. Instanziieren Sie eine verschachtelte Klasse mit einer externen Klasse

【Syntax】 ・ Für die innere Klasse (nicht statische Klasse)


/***Äußerer Klassenname.Name der inneren Klasse Variablenname=
**neuer Name der äußeren Klasse().neuer innerer Klassenname();
*/
Outer.Inner obj = new Outer().new Inner();

・ Für statische Klassen


/***Äußerer Klassenname.statischer Klassenname Variablenname=
**neuer Name der äußeren Klasse.statischer Klassenname();
*/
Outer.StaticInner obj = new Outer.StaticInner();

1-5-2. Instanziieren Sie eine verschachtelte Klasse innerhalb einer Methode der äußeren Klasse

Ein Beispiel für das Instanziieren einer verschachtelten Klasse in der Hauptmethode der äußeren Klasse und das Aufrufen der in der verschachtelten Klasse definierten Elemente.


class Outer{
  private int id = 100;

  class Inner {  //statische Methode kann nicht definiert werden
    public int id = 200;
  //static void hogehoge(){...} //Kompilierungsfehler
    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 {  //Für Mitglieder der äußeren Instanz nicht zugänglich
    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);  //Kompilierungsfehler
    }
  }

  public static void main(String... args){
  //Instanziierung und Berufung der inneren Klasse
    new Outer().new Inner().method(400);
  //new Inner().mehod(400);  //Kompilierungsfehler

    System.out.println();

  //Instanziierung und Aufruf statischer Klassen
    new Outer.Staticinner().method(500);  //Grundlegende Syntax
    new Staticinner().method(600);  //Der Name der äußeren Klasse kann weggelassen werden
    Outer.Staticinner.method(700);  //neu optional
    Staticinner.method(800);        //new,Der Name der äußeren Klasse kann weggelassen werden
  }
}

1-6 Verschachteln in Schnittstellen und abstrakten Klassen + anderen

Mit verschachtelten Klassen können Sie auch Schnittstellen und abstrakte Klassen definieren


class Sample{
//Erben
  abstract class A {abstract void foo();}
  class B extends A {void foo(){}}
//Die Implementierung ist ebenfalls in Ordnung
  interface X {void hoge();}
  class Y implements X {public void hoge(){}}
/*Jedes der oben genannten kann statisch angegeben werden.
Wenn die innere abstrakte Klasse jedoch von einer statischen Klasse geerbt wird, tritt ein Kompilierungsfehler auf.(Es ist kein Problem, die innere Schnittstelle mit einer statischen Klasse zu implementieren)
Natürlich ist auch statisch → statisch in Ordnung.
*/
}

Sie können auch verschachtelte Klassen in Schnittstellen und abstrakten Klassen definieren. Verschachtelte Klassen können auch definiert werden ...

2. Lokale Klasse

Eine Klasse, die innerhalb einer Methode einer bestimmten Klasse definiert ist.

2-1. Funktionen

-Gültig nur innerhalb der Methode (lokal behandelt).

2-2. Lokale Klassenregeln

Lokale Klasse ・ Zugriffsmodifikator(public,protected,private)Kann nicht verwendet werden
・static修飾子Kann nicht verwendet werden
-Abstraktmodifikator und Endmodifikator können verwendet werden.
-Sie können auf die Mitglieder der äußeren Klasse zugreifen.

· Um von der lokalen Klasse aus auf die Methodenargumente und lokalen Variablen der äußeren Klasse zuzugreifen, ist jede Variable endgültig(Konstante)Muss. Daher war es notwendig, den endgültigen Modifikator explizit bis SE7 hinzuzufügen. Da SE8 jedoch endgültig ist, wird final implizit hinzugefügt, sodass keine explizite Hinzufügung erforderlich ist.(Mit anderen Worten, es ist eine praktisch endgültige Variable)

2-2. Beispielcode für die lokale Klasse


//Nur lokale Variablen sind effektiv endgültig

class Outer{
  private static int a = 1;  //statische Variable
  private int b = 2;  //Instanzvariable
  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;Kompilierungsfehler
      //d = 200;Kompilierungsfehler
      }
    }
    a = 10;  //OK
    b = 20;  //OK
  //e = 300;Kompilierungsfehler
  //f = 400;Kompilierungsfehler
    new Local().methodLocal();
  }

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

//Ausführungsergebnis
10203456

[▲ Zurück zur Auswahl](# 1-2-Nest-Klassentyp)

3. Anonyme Klasse

Eine Klasse, in der die Klassendefinition und -instanziierung als ein Ausdruck ohne Angabe des Klassennamens beschrieben werden.

3-1. Funktionen

3-2 Anonyme Klassenregeln

Anonyme Klasse ・ Zugriffsmodifikator(public,protected,private)Kann nicht verwendet werden
・ Der statische Modifikator kann nicht verwendet werden
・abstract修飾子、final修飾子Kann nicht verwendet werden
· Kann auf Mitglieder äußerer Klassen zugreifen
· Kann auf die Methodenargumente und lokalen Variablen der äußeren Klasse zugreifen(Implizites Finale)
-Kann Konstruktor nicht definieren

3-3 Beispiel für eine anonyme Klassendefinition

・ Kein Objektspeicher


class Sample1{
  private String name1 = "piyoko";  //Neu zuweisbar
  void method(String name2){  //Kann nicht neu zugewiesen werden
    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();
}

・ Mit Objektspeicherung


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);
}

//Für Lambda-Typ
MyInter obj = (name) -> {System.out.println(name);}; //Vergessen Sie nicht, beim Einschließen in mittlere Klammern ein Semikolon hinzuzufügen
MyInter obj = name -> System.out.println(name);

//Methodenreferenz
MyInter obj = System.out::println;

[▲ Zurück zur Auswahl](# 1-2-Nest-Klassentyp)

Verweise

・ [Java-Programmierer Gold SE 8 (EXAMPRESS) für das Oracle-Zertifizierungslehrbuch](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)

Ende

Recommended Posts

Verschachtelte Klasse (für mich)
[Java] Verschachtelte Klasse
[Für mich] Übertragung der Servlet-Klassenverarbeitung
Gradle TIPS-Sammlung (für mich)
Aktivieren Sie OpenCV mit Java8. (Für mich)
Java (Klassentyp für Feld verwenden)
Docker-Ausführungsnotiz für mich zusammengestellt
Überprüfen Sie die Notizen für die Klasse java.util.Scanner
Einstellungen zum lokalen Ausführen von CGI-Programmen (für mich selbst)
Ein Überprüfungshinweis für die Klasse java.util.Objects
Form Scala Fallklasse für einfache Anzeige