Warum können Sie eine Klasse in Java nicht als statisch deklarieren?
java
static-class
Mariselvam
quelle
quelle
static
?static
Klassen soabstract final
, dass sie nicht instanziiert und nicht erweitert werden können. Dies bedeutet, dass sie nur statische Elemente enthalten können. Dies ist nützlich für Klassen, die nur Hilfsmethoden enthalten.Antworten:
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.
Quellen:
Zum gleichen Thema:
quelle
Klassen der obersten Ebene sind standardmäßig statisch. Innere Klassen sind standardmäßig nicht statisch. Sie können die Standardeinstellung für innere Klassen ändern, indem Sie sie explizit als statisch markieren. Klassen der obersten Ebene können aufgrund ihrer obersten Ebene keine nicht statische Semantik haben, da es keine übergeordnete Klasse geben kann, auf die Bezug genommen werden kann. Daher gibt es keine Möglichkeit, die Standardeinstellung für Klassen der obersten Ebene zu ändern.
quelle
static
Schlüsselwort in einer Klasse der obersten Ebene angibt und erzwingt, dass es möglicherweise nur statische Elemente enthält und nicht instanziiert wird. das hätte die Leute jedoch verwirren können, dastatic
es für verschachtelte Klassen eine andere Bedeutung hat.Also komme ich zu spät zur Party, aber hier sind meine zwei Cent - eine philosophische Ergänzung zu Colin Heberts Antwort.
Auf hoher Ebene befasst sich Ihre Frage mit dem Unterschied zwischen Objekten und Typen. Während es viele Autos (Objekte) gibt, gibt es nur eine Autoklasse (Typ). Wenn Sie etwas als statisch deklarieren, bedeutet dies, dass Sie im Bereich "Typ" arbeiten. Es gibt nur eins. Das Schlüsselwort class der obersten Ebene definiert bereits einen Typ im Bereich "type". Infolgedessen ist "Auto der öffentlichen statischen Klasse" überflüssig.
quelle
Klasse mit privatem Konstruktor ist statisch.
Erkläre deine Klasse so:
und Sie können ohne Initialisierung verwenden:
quelle
static class
Deklaration in C #), lässt der Compiler nicht einmal zu, dass Code Variablen dieses Typs deklariert oder als generischen Typparameter verwendet. Ein bloßer Mangel an zugänglichen Konstruktoren in einer Klasse, die andernfalls entweder instanziiert oder geerbt werden könnten, würde weder die Deklaration von Variablen dieses Typs noch deren Verwendung als generischer Typparameter ausschließen.Sicher können sie, aber nur
innerverschachtelte Klassen. Dort bedeutet dies, dass Instanzen der verschachtelten Klasse keine umschließende Instanz der äußeren Klasse benötigen.Für Klassen der obersten Ebene konnten sich die Sprachdesigner jedoch nichts Nützliches für das Schlüsselwort vorstellen, daher ist dies nicht zulässig.
quelle
static
, ist es manchmal sinnvoll, dies zu können. Zum Beispiel macht es keinen Sinn, eine Klasse zu instanziieren, die nur statische Hilfsmethoden enthält, aber die Java-Sprache hindert Sie nicht daran, dies zu tun. Sie können die Klasse für andere Klassen nicht instanziierbar (und praktisch 'statisch') machen, indem Sie den Standardkonstruktor deklarierenprivate
, der die Instanziierung verbietet, da kein Konstruktor sichtbar ist.Sie können eine Dienstprogrammklasse erstellen (für die keine Instanzen erstellt werden können), indem Sie einen Aufzählungstyp ohne Instanzen deklarieren. dh Sie erklären ausdrücklich, dass es keine Instanzen gibt.
quelle
... kann als statisch deklariert werden - solange es sich um eine Mitgliedsklasse handelt.
Aus dem JLS:
und hier:
Ein statisches Schlüsselwort wäre für eine Klasse der obersten Ebene nicht sinnvoll, nur weil eine Klasse der obersten Ebene keinen umschließenden Typ hat.
quelle
Inner
du ?Nested
wäre eine weniger verwirrende Wahl gewesen.Wie oben erläutert, kann eine Klasse nur statisch sein, wenn sie Mitglied einer anderen Klasse ist.
Wenn Sie eine Klasse entwerfen möchten, "von der es nicht mehrere Instanzen geben kann", sollten Sie sich das Entwurfsmuster "Singleton" ansehen.
Anfänger Singleton Infos hier .
Vorbehalt:
quelle
Zusätzlich zu der Definition statischer innerer Klassen durch Java gibt es eine andere Definition statischer Klassen gemäß der C # -Welt [1] . Eine statische Klasse hat nur statische Methoden (Funktionen) und soll die prozedurale Programmierung unterstützen. Solche Klassen sind nicht wirklich Klassen, da der Benutzer der Klasse nur an den Hilfsfunktionen interessiert ist und nicht daran, Instanzen der Klasse zu erstellen. Während statische Klassen in C # unterstützt werden, gibt es in Java keine solche direkte Unterstützung. Sie können jedoch Aufzählungen verwenden, um statische C # -Klassen in Java nachzuahmen, sodass ein Benutzer niemals Instanzen einer bestimmten Klasse erstellen kann (auch nicht unter Verwendung von Reflection) [2] :
quelle
Alles, was wir in Java codieren, wird in eine Klasse eingeteilt. Immer wenn wir eine Klasse ausführen, instanziiert JVM ein Objekt. JVM kann eine Reihe von Objekten erstellen. Per Definition bedeutet statisch, dass Sie für alle Objekte den gleichen Kopiersatz haben.
Wenn Java also zugelassen hätte, dass die Top-Klasse beim Ausführen eines Programms statisch ist, wird ein Objekt erstellt und derselbe Speicherort überschrieben.
Wenn Sie das Objekt nur jedes Mal ersetzen, wenn Sie es ausführen, wozu wird es dann erstellt?
Das ist der Grund, warum Java die Statik für die Top-Level-Klasse beseitigt hat.
Es mag konkretere Gründe geben, aber das ergab für mich einen logischen Sinn.
quelle
Die einzigen Klassen, die statisch sein können, sind innere Klassen. Der folgende Code funktioniert einwandfrei:
Der Punkt statischer innerer Klassen ist, dass sie keinen Verweis auf das äußere Klassenobjekt haben.
quelle
Ich denke, das ist so einfach wie ein Glas Kaffee! Schauen Sie sich das an. Bei der Definition der Klasse wird das statische Schlüsselwort nicht explizit verwendet.
Ist das nicht eine Definition der statischen Klasse? Wir verwenden nur eine Funktion, die nur an eine Klasse gebunden ist. Achten Sie darauf, dass wir in diesem Fall eine andere Klasse in dieser verschachtelten Klasse verwenden können. Schau dir das an:
quelle
new StaticClass()
und das macht nicht wirklich viel Sinn. Mit einem privaten Konstruktor würde es keine Instanzen davon zulassen.Man kann schauen ,
PlatformUI
für eine Klasse in Eclipse mit statischen Methoden und privatem Konstruktor mit selbst endgültig zu sein.quelle
Wenn der Vorteil der Verwendung einer statischen Klasse nicht darin bestand, ein Objekt zu instanziieren und eine Methode zu verwenden, deklarieren Sie die Klasse einfach als öffentlich und diese Methode als statisch.
quelle