wake-up-neo.net

Java: Statisch gegen innere Klasse

Was ist der Unterschied zwischen statischen und nicht statischen verschachtelten Klassen?

350

Eine innere Klasse per Definition kann nicht statisch sein, daher werde ich Ihre Frage als "Was ist der Unterschied zwischen statischen und nicht statischen verschachtelten Klassen?"

Eine nicht statische verschachtelte Klasse hat vollen Zugriff auf die Mitglieder der Klasse, in der sie verschachtelt ist. Eine statisch verschachtelte Klasse hat keinen Verweis auf eine Verschachtelungsinstanz, daher kann eine statisch verschachtelte Klasse keine nicht statischen Methoden aufrufen oder auf nicht statische Felder einer Instanz der Klasse zugreifen, in der sie verschachtelt ist.

542

Suchen wir in der Quelle der Weisheit nach solchen Fragen: Joshua Blochs Effektives Java:

Technisch gibt es keine statische innere Klasse. Gemäß Effective Java ist die korrekte Terminologie statische verschachtelte Klasse. Eine nicht statische verschachtelte Klasse ist in der Tat eine innere Klasse, zusammen mit anonymen Klassen und lokalen Klassen.

Und nun zum Zitat:

Jede Instanz einer nicht-statischen verschachtelten Klasse ist implizit einer einschließenden Instanz ihrer enthaltenden Klasse zugeordnet Es ist möglich, Methoden für die einschließende Instanz aufzurufen.

Eine statisch verschachtelte Klasse hat keinen Zugriff auf die einschließende Instanz. Es braucht auch weniger Platz.

125
Steve McLeod

Es gibt zwei Unterschiede zwischen statischen inneren und nicht statischen inneren Klassen.

  1. Im Fall der Deklaration von Elementfeldern und Methoden kann eine nicht statische innere Klasse keine statischen Felder und Methoden haben. Im Fall einer statischen inneren Klasse können jedoch statische und nicht statische Felder und Methoden vorhanden sein.

  2. Die Instanz der nicht statischen inneren Klasse wird mit der Referenz des Objekts der äußeren Klasse erstellt, in der sie definiert wurde, dh, sie hat eine umschließende Instanz. Die Instanz der statischen inneren Klasse wird jedoch ohne die Referenz der äußeren Klasse erstellt, was bedeutet, dass sie keine einschließende Instanz hat.

Siehe dieses Beispiel

class A
{
    class B
    {
        // static int x; not allowed here
    }

    static class C
    {
        static int x; // allowed here
    }
}

class Test
{
    public static void main(String… str)
    {
        A a = new A();

        // Non-Static Inner Class
        // Requires enclosing instance
        A.B obj1 = a.new B(); 

        // Static Inner Class
        // No need for reference of object to the outer class
        A.C obj2 = new A.C(); 
    }
}
64
user918477
  1. Die statische innere Klasse kann nicht auf nicht statische Mitglieder der einschließenden Klasse zugreifen. Es kann direkt auf statische Member (Instanzfeld und Methoden) zugreifen, um eine Klasse einzuschließen, wie es der prozedurale Stil zum Abrufen von Werten ohne das Erstellen von Objekten vorsieht.

  2. Statische innere Klasse kann sowohl statische als auch nicht statische Member deklarieren. Die statischen Methoden haben Zugriff auf statische Member der Hauptklasse. Es kann jedoch nicht auf nicht statische Mitglieder der inneren Klasse zugreifen. Um auf Mitglieder einer nicht statischen inneren Klasse zuzugreifen, muss ein Objekt einer nicht statischen inneren Klasse erstellt werden.

  3. Die nicht statische innere Klasse kann keine statischen Felder und statischen Methoden deklarieren. Es muss entweder als statischer Typ oder als Typ der obersten Ebene deklariert werden. Sie erhalten diese Fehlermeldung, wenn Sie sagen, dass "statische Felder nur in statischen oder übergeordneten Typen deklariert werden".

  4. Die nicht statische innere Klasse kann sowohl auf statische als auch auf nicht statische Mitglieder der einschließenden Klasse zugreifen, um den Wert zu ermitteln. Sie kann jedoch nicht auf Mitglieder der statischen inneren Klasse zugreifen.

  5. Die einschließende Klasse kann erst dann auf Mitglieder innerer Klassen zugreifen, wenn sie ein Objekt innerer Klassen erstellt. Wenn eine Hauptklasse auf Mitglieder einer nicht statischen Klasse zugreift, kann sie ein Objekt einer nicht statischen inneren Klasse erstellen.

  6. Wenn die Hauptklasse auf Mitglieder der statischen inneren Klasse zugreift, gibt es zwei Fälle:

    • Fall 1: Für statische Member kann der Klassenname der statischen inneren Klasse verwendet werden
    • Fall 2: Bei nicht statischen Elementen kann eine Instanz einer statischen inneren Klasse erstellt werden.
13

Diskutiere verschachtelte Klassen ...

Der Unterschied besteht darin, dass eine verschachtelte Klassendeklaration, die auch statisch ist, außerhalb der einschließenden Klasse instanziiert werden kann.

Wenn Sie eine geschachtelte Klassendeklaration haben, die nicht statisch, Java) ist, können Sie sie nur über die einschließende Klasse instanziieren. Das Objekt, das aus der inneren Klasse erstellt wurde ist mit dem aus der äußeren Klasse erstellten Objekt verknüpft, sodass die innere Klasse auf die Felder der äußeren Klasse verweisen kann.

Wenn es sich jedoch um statisch handelt, ist der Link nicht vorhanden, auf die äußeren Felder kann nicht zugegriffen werden (außer über eine normale Referenz wie bei jedem anderen Objekt), und Sie können die verschachtelte Klasse daher selbst instanziieren.

10
DigitalRoss

statische innere Klasse: Kann statische und nicht statische Member deklarieren, aber nur auf statische Member der übergeordneten Klasse zugreifen.

nicht statische innere Klasse: Kann nur nicht statische Member deklarieren, aber auf statische und nicht statische Member der übergeordneten Klasse zugreifen.

3
Vijay Kumar

Eine innere Klasse kann nicht statisch sein, daher werde ich Ihre Frage neu formulieren als "Was ist der Unterschied zwischen statischen und nicht statischen verschachtelten Klassen?".

wie Sie hier sagten, kann die innere Klasse nicht statisch sein ... Ich habe den folgenden Code gefunden, der statisch ist ... Grund? oder was ist richtig ....

Ja, nichts in der Semantik eines statisch verschachtelten Typs würde Sie davon abhalten, dies zu tun. Dieses Snippet läuft gut.

    public class MultipleInner {
        static class Inner {
        }   
    public static void main(String[] args) {
        for (int i = 0; i < 100; i++) {
            new Inner();
        }
    }
}

dies ist ein Code, der auf dieser Website veröffentlicht wurde ...

für die Frage ---> Kann eine statisch verschachtelte Klasse mehrere Male instanziiert werden?

die Antwort war --->

Natürlich kann der verschachtelte Typ jetzt seine eigene Instanzsteuerung durchführen (z. B. private Konstruktoren, Singleton-Muster usw.), aber das hat nichts mit der Tatsache zu tun, dass es sich um einen verschachtelten Typ handelt. Wenn der verschachtelte Typ eine statische Aufzählung ist, können Sie ihn natürlich überhaupt nicht instanziieren.

Aber im Allgemeinen kann ein statisch verschachtelter Typ mehrere Male instanziiert werden.

Beachten Sie, dass ein statisch verschachtelter Typ technisch gesehen kein "innerer" Typ ist.

3
kathir

Eine statisch verschachtelte Klasse interagiert mit den Instanzmitgliedern ihrer äußeren Klasse (und anderen Klassen) wie mit jeder anderen Klasse der obersten Ebene. Tatsächlich ist eine statische verschachtelte Klasse eine Klasse der obersten Ebene, die aus Gründen der Packungsfreundlichkeit in einer anderen Klasse der obersten Ebene verschachtelt wurde.

2
Emil