483 Stimmen

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

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

495voto

Colin Hebert Punkte 88407

Nur verschachtelte Klassen können statisch sein. Auf diese Weise können Sie die verschachtelte Klasse verwenden, ohne eine Instanz der äußeren Klasse zu haben.

class OuterClass {
    public static class StaticNestedClass {
    }

    public class InnerClass {
    }

    public InnerClass getAnInnerClass() {
        return new InnerClass();
    }

    //This method doesn't work
    public static InnerClass getAnInnerClassStatically() {
        return new InnerClass();
    }
}

class OtherClass {
    //Use of a static nested class:
    private OuterClass.StaticNestedClass staticNestedClass = new OuterClass.StaticNestedClass();

    //Doesn't work
    private OuterClass.InnerClass innerClass = new OuterClass.InnerClass();

    //Use of an inner class:
    private OuterClass outerclass= new OuterClass();
    private OuterClass.InnerClass innerClass2 = outerclass.getAnInnerClass();
    private OuterClass.InnerClass innerClass3 = outerclass.new InnerClass();
}

Quellen:

Zum gleichen Thema:

45voto

necromancer Punkte 22776

Klassen der obersten Ebene sind standardmäßig statisch. Innere Klassen sind standardmäßig nicht statisch. Sie können die Voreinstellung für innere Klassen ändern, indem Sie sie explizit als statisch markieren. Klassen der obersten Ebene können keine nichtstatische Semantik haben, da es keine übergeordnete Klasse gibt, auf die sie sich beziehen können. Daher gibt es keine Möglichkeit, die Voreinstellung für Top-Level-Klassen zu ändern.

40voto

Eric Jankowski Punkte 453

Ich komme also zu spät zur Party, aber hier sind meine zwei Cents - als philosophische Ergänzung zu Colin Heberts Antwort.

Auf einer hohen Ebene geht es bei Ihrer Frage um den Unterschied zwischen Objekten und Typen. Während es viele Autos (Objekte) gibt, gibt es nur eine Klasse Car (Typ). Etwas als statisch zu deklarieren bedeutet, dass Sie sich im "Typ"-Raum bewegen. Es gibt nur einen. Das Schlüsselwort class der obersten Ebene definiert bereits einen Typ im "type"-Raum. Folglich ist "public static class Car" überflüssig.

32voto

Sergey Vakulenko Punkte 1605

Klasse mit privatem Konstruktor ist statisch.

Deklarieren Sie Ihre Klasse wie folgt:

public class eOAuth {

    private eOAuth(){}

    public final static int    ECodeOauthInvalidGrant = 0x1;
    public final static int    ECodeOauthUnknown       = 0x10;
    public static GetSomeStuff(){}

}

und kann ohne Initialisierung verwendet werden:

if (value == eOAuth.ECodeOauthInvalidGrant)
    eOAuth.GetSomeStuff();
...

13voto

Michael Borgwardt Punkte 334642

Natürlich können sie das, aber nur innen verschachtelte Klassen. Dort bedeutet es, dass Instanzen der geschachtelten Klasse keine umschließende Instanz der äußeren Klasse benötigen.

Aber für Top-Level-Klassen konnten die Sprachdesigner nichts Sinnvolles mit dem Schlüsselwort anfangen, also ist es nicht erlaubt.

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