"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.
Comme le mot le dit, c'est une classe à l'intérieur de la classe.
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
Lequel est pertinent est très important et Il s'est avéré que l'utilisation était décidée.
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.
(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 {}
}
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
Instanciation de classe interne non statique
Outer.Inner inner = (new Outer()).new Inner();
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
Pourquoi vous pouvez voir Inner private de __Outer: __
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! !! !! __
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
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
Vous pouvez spécifier la plage de variables avec this.variable, Outer.this.variable. Vous pouvez voir à partir de cette figure cachée! !!
C'est comme une classe ordinaire! !! Cependant, il a également ses propres caractéristiques en tant que classe interne.
Comme les classes internes non statiques, le niveau supérieur est une classe, donc privé et protégé peuvent être utilisés.
Parce qu'il appartient à la classe externe ainsi qu'à la classe interne non statique.
Instanciation de classe interne statique
Outer.Inner inner = new Outer.Inner();
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);
}
À partir de Effective Java 2nd Edition (The Java Series)
Recommended Posts