2011-01-15 5 views

Antwort

2

Die JVM garantiert, dass jede Klasse genau einmal initialisiert wird.

Was genau Low-Level-Mechanismus verwendet wird, ist wirklich JVM-spezifisch, aber die Sache, die Sie als Programmierer wissen müssen, ist, dass es thread-safe per se versucht, auf die gleiche Klasse zuzugreifen/zu initialisieren verschiedene Themen. (Natürlich gilt das nur für das Laden von Klassen: im Hinblick auf den Zugriff auf unveränderliche Daten, sei es statisch oder einer bestimmten Instanz, müssen Sie geeignete Maßnahmen ergreifen.)

1

Sie können eine statische geschachtelte Klasse haben und sich wie jede andere Klasse verhalten.

Ich nehme an, Sie beziehen sich auf statische Code/Blöcke und Klasseninitialisierung. Die JVM garantiert, dass eine Klasse nur von einem Thread geladen wird. Seit seiner Einbettung in die JVM stelle ich mir nicht vor, dass irgendwelche Sprachen es nicht benutzen würden.

0

Zunächst einmal ist das statische Schlüsselwort nicht so häufig in Klassendeklarationen verwendet, obwohl es dort verwendet werden kann, bedeutet aber etwas anderes als für Variablen oder Methoden.

Wollten Sie wirklich über statische Klassen wissen? Oder war es eine Frage über statische Variablen/Methoden?

0

Statisch wird alles initialisiert, wenn die Klasse geladen wird, nicht wenn der erste Thread versucht, darauf zuzugreifen. static für eine Klasse ist jedoch nicht identisch mit static für ein Datenelement oder eine Funktion/Methode. Weitere Informationen hierzu finden Sie unter this article. Wenn Sie nach Datenmembern fragen, wenn sie statisch sind, werden sie als "Klassenvariablen" oder "Klassenmethoden" und nicht als "Objektvariablen" betrachtet (siehe this article from Oracle for that discussion). Dies wird dadurch erreicht, dass sie Teil des Klassenobjekts selbst und nicht der Instanzen werden. Es gibt immer nur ein Klassenobjekt für eine bestimmte Klasse.

In Bezug auf Ihre Frage zu anderen Sprachen: nein, statisch kann je nach Sprache viele verschiedene Dinge bedeuten.

+0

Können Sie eine Klasse laden, ohne einen Thread zu verwenden? –

+0

Ich bin mir nicht sicher, ob ich deine Frage vollständig verstanden habe. Üblicherweise wird das Laden von Klassen von der JVM übernommen, Sie können jedoch Klassen explizit mit der 'Class.forName()' Methode laden. Unweigerlich muss ein Thread das Laden durchführen, aber Sie müssen nicht explizit ein 'new Thread()' -Objekt deklarieren, um eine Klasse zu laden. –

Verwandte Themen