Überprüfung der Java-Innenklasse

"Java innere Klasse", Es gab viele Orte, von denen ich nicht wusste, dass ich sie unerwartet kannte.

Was ist eine innere Klasse?

Wie das Wort sagt, ist es eine Klasse innerhalb der Klasse.

Verwendung in der inneren 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

Klassifikation der inneren Klassen

  1. Nicht statische innere Klassen sind __outer Klasseninstanzen __ zugeordnet
  2. Die statische innere Klasse ist mit der __outer-Klasse __ verwandt
  3. Die lokale innere Klasse ist mit der __- Methode __ verwandt

Welches relevant ist, ist sehr wichtig und Es stellte sich heraus, dass die Verwendung entschieden wurde.

Merkmale nicht statischer innerer Klassen

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.

Privat und geschützt kann verwendet werden, obwohl es sich um eine Klasse handelt

(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 {}
}
  1. Die obere Einheit der Klasse ist Paket, und öffentlich und Paket privat sind ausreichend.
  2. Da die übergeordnete Einheit der nicht statischen inneren Klasse die äußere Klasse ist, kann jede Sichtbarkeit verwendet werden.

Das Innere kann das Äußere sehen, aber das Äußere kann das Innere nicht sehen

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

  1. "Nicht statische innere Klasseninstanz existiert = äußere Klasseninstanz existiert" ⇒ Sie können die Außenseite von innen sehen
  2. "Es gibt eine Instanz der äußeren Klasse. Es gibt eine nicht statische Instanz der inneren Klasse." ⇒ Das Innere ist von außen nicht zu sehen

Nicht statische Instanziierung der inneren Klasse

Nicht statische Instanziierung der inneren Klasse


Outer.Inner inner = (new Outer()).new Inner();
  1. (new Outer ()) -> Externe Klasseninstanz
  2. Äußere Klasse .new Inner () -> Instanziierung einer nicht statischen inneren Klasse innerhalb einer Instanz der äußeren Klasse

Nicht statische Instanzen innerer Klassen sind äußeren Klassen ausgesetzt

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

  1. Auch privat kann von der externen Klasse aus gesehen werden
  2. Sichtbarkeit funktioniert von anderen Klassen

Warum Sie Inner privat von __Outer sehen können: __ inner-private.png

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! !! !! __ __

statisches Feld, Methode, Block können nicht verwendet werden

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

  1. Da statisch für die Zuordnung zu einer Klasse und nicht zu einer Instanz vorgesehen ist Kompilierungsfehler, da er grammatikalisch inkonsistent ist

Variable Priorität

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

  1. Lokale Variable in der Methode
  2. Instanzvariablen der inneren Klasse
  3. Externe Klasseninstanzvariablen

Sie können den Variablenbereich mit this.variable, Outer.this.variable angeben. var-priority.png Sie können von dieser debacked Figur sehen! !!

Merkmale der statischen inneren Klasse

Es ist wie in einer regulären Klasse! !! Es hat jedoch auch seine eigenen Eigenschaften als innere Klasse.

Privat und geschützt kann verwendet werden, obwohl es sich um eine Klasse handelt

Wie nicht statische innere Klassen ist die obere Ebene eine Klasse, sodass private und geschützte Klassen verwendet werden können.

Die statische Instanz der inneren Klasse ist von der äußeren Klasse vollständig sichtbar

Weil es sowohl zur äußeren als auch zur nicht statischen inneren Klasse gehört.

Statische Instanziierung der inneren Klasse

Statische Instanziierung der inneren Klasse


Outer.Inner inner = new Outer.Inner();
  1. neue äußere Klasse. Kann durch statische innere Klasse generiert werden ()

lokale innere Klasse

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);
}
  1. Ebenso wie private und geschützte für lokale Variablen nicht erforderlich sind, kann __visibility nicht verwendet werden __
  2. __static kann nicht verwendet werden, da es mit der Methode __ zusammenhängt

Zusammenfassung

  1. Wenn Sie eine innere Klasse verwenden, ist es wichtig zu klären, __ "was (Klasse, Instanz, Methode) Sie mit" __ "verknüpfen möchten.
  2. In der Regel wird empfohlen, dass die innere Klasse statisch ist. Der Hauptgrund ist, dass nicht statische innere Klassen implizit auf Instanzen einschließender Klassen (Klassen der obersten Ebene) verweisen. (Sicherheit ??) "diese $ 0"

inner-private.png

Ab Effective Java 2nd Edition (Die Java-Serie)

Recommended Posts

Überprüfung der Java-Innenklasse
Java-Klassenmethoden
[Java] Klassenvererbung
Java-Scanner-Klasse
Java HashMap-Klasse
Java (abstrakte Klasse)
[Java] Verschachtelte Klasse
Anonyme Java-Klasse
Über die Java-Klasse
[Java] Abstrakte Klasse
[Java] Objektklasse
Lokale Java-Klasse
Java IO Bewertung
Über die Klassenteilung (Java)
Informationen zur Java StringBuilder-Klasse
NIO.2 Überprüfung von Java
Bewertung von Java Shilber
[Java] Über Singleton Class
Überprüfungshinweise zu Java NIO 2
Anwendungsbeispiel für die innere Klasse
Feld für den Java-Klassentyp
Java-Programmierung (Klassenmethode)
Informationen zur Java String-Klasse
Ein kurzer Überblick über Java, das im Unterricht gelernt wurde
Überprüfen Sie jetzt die Java-Anmerkungen
NIO Bewertung von Java
Java-Programmierung (Klassenstruktur)
Überprüfen Sie java8 ~ Lambda Typ ~
Über die abstrakte Klasse von Java
Ein kurzer Überblick über Java, das in Klasse 4 gelernt wurde
Ein kurzer Überblick über Java, das in Klasse 3 gelernt wurde
Ein kurzer Überblick über Java, das in Klasse 2 gelernt wurde
[Java] Integer-Wrapper-Klassenreferenz
Java-Memo-Teilzeichenfolge (Standardklasse)
Java-Tipps - Modifikatoren der StataticUtility-Klasse
Progate Java (Anfänger) Review & Zusammenfassung
Java unflexibler String-Klassen-Teilstring
Länge des Java-Memos (Standardklasse)
[Implementierung] Java Prozessklassennotizen
Überprüfungshinweise zum Java Collections Framework
Informationen zu Java Class Loader-Typen
[Java] Komparator der Collection-Klasse
Definition und Instanziierung von Java-Klassen
Java-Lernnotiz (abstrakte Klasse)
Zusammenfassung der Java Math Klasse
[Java] Was ist Klassenvererbung?
Java-Klasse Variable Klassenmethode
[Java-Grundlagen] Was ist Klasse?
Erstellen Sie mit JAVA eine unveränderliche Klasse
Warum werden Klassenvariablen benötigt? [Java]
Rufen Sie Kotlins versiegelte Klasse von Java aus an
[Java] Objektorientierte Syntaxklassenmethode / Argument
Verschiedene Methoden der Java String Klasse
[Java] Memo zum Benennen von Klassennamen
So zerlegen Sie eine Java-Klassendatei
Kotlin-Klasse zum Senden an Java-Entwickler
StringBuffer- und StringBuilder-Klasse in Java
So dekompilieren Sie eine Java-Klassendatei
Java (Klassentyp für Feld verwenden)
Java