383 Stimmen

Java: Statische vs. innere Klasse

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

0 Stimmen

Java doc Terminologie : Verschachtelte Klassen werden in zwei Kategorien unterteilt: statische und nicht-statische. Verschachtelte Klassen, die als statisch deklariert sind, werden statische verschachtelte Klassen genannt. Nicht-statische verschachtelte Klassen werden innere Klassen genannt.

583voto

Brandon E Taylor Punkte 24119

Eine innere Klasse, per Definition kann nicht statisch sein, also werde ich Ihre Frage umformulieren in "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 statische verschachtelte Klasse hat keinen Verweis auf eine Verschachtelungsinstanz, so dass eine statische verschachtelte Klasse keine nicht-statischen Methoden aufrufen oder auf nicht-statische Felder einer Instanz der Klasse, in der sie verschachtelt ist, zugreifen kann.

3 Stimmen

Gute antwort. der zugriff auf statische members von instanzen aus ist so unlogisch. es sollte nur möglich sein, auf statische members über SomeClass.StaticMember oder, innerhalb SomeClass , über StaticMember (ohne this. ), dann würden wir diese Fragen gar nicht bekommen.

6 Stimmen

@Brandon: Wenn Sie sagen: "Statische verschachtelte Klasse kann keine nicht-statischen Methoden aufrufen oder auf nicht-statische Felder einer Instanz der Klasse zugreifen, in der sie verschachtelt ist." ... Das bedeutet, ohne ein Objekt der umschließenden Klasse zu erzeugen, richtig? Denn so wie ich es sehe, ist eine verschachtelte statische Klasse vom Verhalten her eine Klasse der obersten Ebene, die zur Vereinfachung der Verpackung in eine andere Klasse der obersten Ebene verschachtelt wurde. Es sollte also möglich sein, über ein Objekt auf nicht-statische Mitglieder zuzugreifen.

142voto

Steve McLeod Punkte 50514

Schauen wir in die Quelle der Weisheit für solche Fragen: Effektives Java von Joshua Bloch :

Technisch gesehen gibt es so etwas wie eine statische innere Klasse nicht. Gemäß Leistungsfähiges Java ist die korrekte Terminologie ein statische verschachtelte Klasse . Eine nicht-statische verschachtelte Klasse ist in der Tat eine innere Klasse, ebenso wie anonyme Klassen und lokale Klassen.

Und nun zum Zitat:

Jede Instanz eines nicht-statischen verschachtelt Klasse implizit zugeordnet ist mit einer umschließende Instanz der sie enthaltenden Klasse... Es ist möglich Methoden auf der umschließenden Instanz aufzurufen.

Eine statische verschachtelte Klasse hat keinen Zugriff auf die umschließende Instanz. Sie verbraucht auch weniger Platz.

16 Stimmen

Ich habe es gerade gelesen. Punkt 22: Bevorzugen Sie statische Mitgliedsklassen gegenüber nicht-statischen

5 Stimmen

Bloch weist auch darauf hin, dass der Verweis auf die umschließende Instanz in einer unnötigen nicht statischen inneren Klasse Garbage Collect verhindern könnte, wenn er beibehalten wird.

2 Stimmen

Wann ist das eine dem anderen vorzuziehen?

76voto

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

  1. Bei der Deklaration von Mitgliedsfeldern und Methoden, nicht statischen innere Klasse keine statischen Felder und Methoden haben. Aber, im Falle der statischen inneren Klasse, kann statische und nicht statische Felder und Methoden haben.

  2. Die Instanz der nicht statischen inneren Klasse wird mit der Referenz des Objekts der äußeren Klasse erstellt, in der sie definiert ist, das heißt, sie hat umschließende Instanz. Aber die Instanz der statischen inneren Klasse wird ohne den Verweis auf die äußere Klasse erstellt, was bedeutet, dass sie keine umschließ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(); 
    }
}

0 Stimmen

Da es eine von ihnen nicht gibt, ist der Unterschied unendlich groß.

7 Stimmen

Beispiele sind wirklich hilfreich =)

0 Stimmen

Beide Zweifel (statisch/nicht statisch) in einem Beispiel gelöst, sehr gut!

18voto

abishkar bhattarai Punkte 7113
  1. Statische innere Klasse kann nicht auf nicht-statische Mitglieder der umschließenden Klasse zugreifen. Sie kann direkt auf statische Mitglieder (Instanzfeld und Methoden) der umschließenden Klasse zugreifen, genauso wie bei der prozeduralen Methode, Werte zu erhalten, ohne ein Objekt zu erstellen.

  2. Eine statische innere Klasse kann sowohl statische als auch nicht-statische Mitglieder deklarieren. Die statischen Methoden haben Zugriff auf die statischen Mitglieder der Hauptklasse. Sie können jedoch nicht auf nicht-statische Mitglieder der inneren Klasse zugreifen. Um auf die Mitglieder der nicht-statischen inneren Klasse zuzugreifen, muss sie ein Objekt der nicht-statischen inneren Klasse erstellen.

  3. Nicht-statische innere Klassen können keine statischen Felder und statischen Methoden deklarieren. Es muss entweder in statischen oder Top-Level-Typen deklariert werden. Wenn Sie dies tun, erhalten Sie die Fehlermeldung "static fields only be declared in static or top level types".

  4. Eine nicht-statische innere Klasse kann sowohl auf statische als auch auf nicht-statische Mitglieder der umschließenden Klasse im prozeduralen Stil zugreifen, um Werte zu erhalten, aber sie kann nicht auf Mitglieder der statischen inneren Klasse zugreifen.

  5. Die umschließende Klasse kann erst dann auf Mitglieder innerer Klassen zugreifen, wenn sie ein Objekt der inneren Klassen erzeugt. Wenn die 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 Mitglieder kann der Klassenname der statischen inneren Klasse verwendet werden
    • Fall 2: Für nicht-statische Mitglieder kann eine Instanz der statischen inneren Klasse erstellt werden.

1 Stimmen

Würden Sie bitte die Grammatik an Stellen wie "IF main class in accessing members of non-static class" oder "If main class in accessing members of static inner class" korrigieren. Ich habe keine Ahnung, was Sie dort zu sagen versuchen.

11voto

DigitalRoss Punkte 138823

Diskutieren Sie über verschachtelt Klassen...

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

Wenn Sie eine verschachtelte Klassendeklaration haben, die nicht statisch lässt Java die Instanziierung nicht zu, außer über die umschließende Klasse. Das aus der inneren Klasse erstellte Objekt ist mit dem aus der äußeren Klasse erstellten Objekt verknüpft, so dass die innere Klasse auf die Felder der äußeren Klasse verweisen kann.

Aber wenn es statisch dann existiert die Verknüpfung nicht, auf die äußeren Felder kann nicht zugegriffen werden (außer über einen gewöhnlichen Verweis wie bei jedem anderen Objekt) und Sie können daher die verschachtelte Klasse selbst instanziieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X