483 Stimmen

Warum kann man in Java eine Klasse nicht als statisch deklarieren?

Warum kann man in Java eine Klasse nicht als statisch deklarieren?

9voto

Andreas Dolk Punkte 110776
public class Outer {
   public static class Inner {}
}

... sie kann als statisch deklariert werden - solange sie eine Mitgliedsklasse ist.

Aus der JLS:

Mitgliedsklassen können statisch sein, in diesem Fall haben sie keinen Zugriff auf die Instanzvariablen der umgebenden Klasse; oder sie können innere Klassen sein (§8.1.3).

und hier:

Das Schlüsselwort static kann die Deklaration eines Membertyps C innerhalb des Körpers einer Nicht-Innenklasse T ändern. Damit wird erklärt, dass C keine innere Klasse ist. So wie eine statische Methode von T keine aktuelle Instanz von T in ihrem Körper hat, hat auch C keine aktuelle Instanz von T und auch keine lexikalisch umschließenden Instanzen.

Ein statisches Schlüsselwort würde für eine Klasse der obersten Ebene keinen Sinn machen, da eine Klasse der obersten Ebene keinen umschließenden Typ hat.

6voto

S.Jones Punkte 1147

Wie oben erläutert, kann eine Klasse nur statisch sein, wenn sie Mitglied einer anderen Klasse ist.

Wenn Sie eine Klasse entwerfen wollen, von der es nicht mehrere Instanzen geben kann, sollten Sie sich mit dem Entwurfsmuster "Singleton" befassen.

Infos für Anfänger Singleton aquí .

Vorbehalt:

Wenn Sie daran denken, die Singleton-Muster zu verwenden, widerstehen Sie mit aller Kraft. Es ist eines der am einfachsten zu verstehenden DesignPatterns zu verstehen, wahrscheinlich das beliebteste und definitiv das am meisten missbraucht. (Quelle: JavaRanch wie oben verlinkt)

4voto

shams Punkte 3400

Zusätzlich zu der Art und Weise, wie Java statische innere Klassen definiert, gibt es eine weitere Definition von statischen Klassen in der C#-Welt [1] . Eine statische Klasse ist eine Klasse, die nur statische Methoden (Funktionen) hat und die prozedurale Programmierung unterstützen soll. Solche Klassen sind keine wirklichen Klassen, da der Benutzer der Klasse nur an den Hilfsfunktionen und nicht an der Erstellung von Instanzen der Klasse interessiert ist. Während statische Klassen in C# unterstützt werden, gibt es in Java keine solche direkte Unterstützung. Sie können jedoch Enums verwenden, um statische C#-Klassen in Java zu imitieren, so dass ein Benutzer niemals Instanzen einer bestimmten Klasse erstellen kann (selbst unter Verwendung von Reflection) [2] :

public enum StaticClass2 {
    // Empty enum trick to avoid instance creation
    ; // this semi-colon is important

    public static boolean isEmpty(final String s) {
        return s == null || s.isEmpty();
    }
}

3voto

user2626445 Punkte 1031

Alles, was wir in Java codieren, geht in eine Klasse. Immer wenn wir eine Klasse ausführen, instanziiert die JVM ein Objekt. JVM kann eine Reihe von Objekten erstellen, per Definition Static bedeutet, dass Sie den gleichen Satz von Kopien für alle Objekte haben.

Wenn Java also erlaubt hätte, dass die oberste Klasse statisch ist, würde es jedes Mal, wenn Sie ein Programm ausführen, ein Objekt erstellen und immer wieder auf denselben Speicherort überschreiben.

Wenn Sie das Objekt einfach jedes Mal ersetzen, wenn Sie es ausführen, was ist dann der Sinn, es zu erstellen?

Das ist also der Grund, warum Java die statische Klasse für die oberste Ebene abgeschafft hat.

Es mag konkretere Gründe dafür geben, aber für mich war das sehr logisch.

2voto

user2645256 Punkte 29

Die einzigen Klassen, die statisch sein können, sind innere Klassen. Der folgende Code funktioniert einwandfrei:

public class whatever {
    static class innerclass {
    }
}

Der Sinn von statischen inneren Klassen ist, dass sie keinen Verweis auf das Objekt der äußeren Klasse haben.

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