"Java innere Klasse", Es gab viele Orte, von denen ich nicht wusste, dass ich sie unerwartet kannte.
Wie das Wort sagt, ist es eine Klasse innerhalb der Klasse.
Als Anwendung bietet es eine bessere Verschleierung (Kapselung). Klassen, die bedeutungslos sind, wenn Sie die äußere Klasse verlassen, können darin versteckt werden. 例:Cow.javaとCowLeg.java
Welches relevant ist, ist sehr wichtig und Es stellte sich heraus, dass die Verwendung entschieden wurde.
Es wird genauso behandelt wie nicht statische Felder, Methoden, Konstruktoren usw. externer Klassen. ⇒ Elemente, die nur verwendet werden können, wenn die Instanz vorhanden ist.
(Sie können auch statisch hinzufügen, aber es wird eine statische innere Klasse sein, also später)
private,geschützte Sichtbarkeit
public class Outer {
public class PublicInner {}
private class PrivateInner {}
public class PackagePrivateInner {}
}
Sichtweite
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;
}
}
Nicht statische innere Klassen sind __outer Klasseninstanzen __ zugeordnet
Nicht statische Instanziierung der inneren Klasse
Outer.Inner inner = (new Outer()).new Inner();
Zugriff von externer Klasse
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);
}
}
Zugriff von anderen Klassen
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);
}
Instanzen der inneren Klasse
Warum Sie Inner privat von __Outer sehen können: __
Outer$Inner@461 Ich verstehe, dass Inner nicht unabhängig ist, sondern Teil von Outer. Da es sich also in derselben Klasse befindet, ist Private of Inner auch in Outer zu sehen. Gleiches galt für statische innere Klassen.
__ Ich suche eine bessere Interpretation! !! !! __ __
Kompilierungsfehler: 「Inner classes cannot have static declarations」
statisches Mitglied ist NG
public class Outer2 {
public class Inner {
static { /** something **/ }
public static int staticValue;
public static void staticMethod() { /** something **/ }
}
}
Nicht statische innere Klassen sind __outer Klasseninstanzen __ zugeordnet
Variable Priorität
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
Die Priorität nicht statischer innerer Klassen ist
Sie können den Variablenbereich mit this.variable, Outer.this.variable angeben. Sie können von dieser debacked Figur sehen! !!
Es ist wie in einer regulären Klasse! !! Es hat jedoch auch seine eigenen Eigenschaften als innere Klasse.
Wie nicht statische innere Klassen ist die obere Ebene eine Klasse, sodass private und geschützte Klassen verwendet werden können.
Weil es sowohl zur äußeren als auch zur nicht statischen inneren Klasse gehört.
Statische Instanziierung der inneren Klasse
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);
}
Ab Effective Java 2nd Edition (Die Java-Serie)
Recommended Posts