Vous pouvez définir plus de classes dans la définition de classe, et le nom est appelé classe imbriquée.
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.
Les classes imbriquées sont divisées dans les types suivants.
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. |
Nom de classe externe$Nom de classe imbriqué.class
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)
【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();
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
}
}
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 ...
Une classe définie dans une méthode d'une certaine classe.
-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)
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) |
---|
//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)
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.
-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
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 |
---|
・ 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)
・ [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