Sie können weitere Klassen in der Klassendefinition definieren, und der Name wird als verschachtelte Klasse bezeichnet.
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.
Verschachtelte Klassen werden in die folgenden Typen unterteilt.
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. |
Äußerer Klassenname$Verschachtelter Klassenname.class
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)
【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();
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
}
}
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 ...
Eine Klasse, die innerhalb einer Methode einer bestimmten Klasse definiert ist.
-Gültig nur innerhalb der Methode (lokal behandelt).
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) |
---|
//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)
Eine Klasse, in der die Klassendefinition und -instanziierung als ein Ausdruck ohne Angabe des Klassennamens beschrieben werden.
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 |
---|
・ 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)
・ [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