Warum kann man in Java eine Klasse nicht als statisch deklarieren?
Antworten
Zu viele Anzeigen?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:
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.
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.
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();
...
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.
- See previous answers
- Weitere Antworten anzeigen