Was ist der Unterschied zwischen einer statischen und einer nicht-statische Initialisierung code-block
Meine Frage ist über eine bestimmte Verwendung des static-Schlüsselworts. Es ist möglich, verwenden Sie static
Stichwort decken einen code-block innerhalb einer Klasse, die nicht gehören zu jeder Funktion. Zum Beispiel der folgende code kompiliert werden:
public class Test {
private static final int a;
static {
a = 5;
doSomething(a);
}
private static int doSomething(int x) {
return (x+5);
}
}
Wenn Sie entfernen die static
Stichwort beschwert es sich, weil die variable a
ist final
. Allerdings ist es möglich, entfernen Sie die beiden final
und static
keywords und machen es zu kompilieren.
Ist es verwirrend für mich in beide Richtungen. Wie soll ich einen code-Abschnitt, der gehört nicht zu irgendeiner Methode? Wie ist es möglich, um es aufzurufen? Im Allgemeinen, was ist der Zweck dieser Nutzung? Oder besser, wo finde ich Dokumentation dazu?
InformationsquelleAutor Szere Dyeri | 2008-12-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den code-block mit dem static-Modifizierer gibt an, ein Klasse Initialisierer;, ohne den static modifier code-block ist ein Instanz Initialisierung.
Klasse Initialisierungen ausgeführt, in der Reihenfolge, wie Sie definiert sind (von oben nach unten, genauso wie einfache Variablen-Initialisierungen), wenn die Klasse geladen wird (eigentlich, wenn es behoben ist, aber das ist eine Formsache).
Beispiel Initialisierungen in der Reihenfolge ausgeführt werden definiert, wenn die Klasse instanziiert wird, unmittelbar bevor der Konstruktor-code ausgeführt wird, unmittelbar nach dem Aufruf des super-Konstruktors.
Wenn Sie entfernen
static
ausint a
es wird eine Instanz-variable, die Sie nicht in der Lage, den Zugriff aus dem statischen Initialisierer block. Diese werden nicht kompiliert werden, mit dem Fehler "non-static variable a wird verwiesen werden kann nicht aus einem statischen Kontext".Wenn Sie auch entfernen
static
aus den Initialisierung-block, es wird dann ein Instanz-Initialisierer und soint a
initialisiert wird beim Bau.public static void staticMethod(){}
wenn Sie ausführenTestStatic.class.getMethod("staticMethod");
. Die statischen Initialisierer werden nicht aufgerufen. Mehr Infos hier docs.oracle.com/javase/specs/jvms/se10/html/...Ja, das ist es, was die Auflösung der Klasse bringt (zumindest Sie verwendet, zu beziehen sich auf Sie als link+init als "Lösung" Weg zurück, wenn). Ich bin nicht überrascht, dass Sie verwenden können, Reflexion, Dinge zu entdecken, über eine Klasse, ohne es auflösen.
InformationsquelleAutor Lawrence Dol
Uff! was ist statische Initialisierer?
Der statische Initialisierer ist ein
static {}
block von code innerhalb der java-Klasse, und führen Sie nur einmal vor dem Konstruktor oder in der main-Methode aufgerufen wird.OK! Erzählen Sie mir mehr...
static { ... }
innerhalb einer java-Klasse. und Ausführung durch die virtuelle Maschine, wenn die Klasse aufgerufen wird.return
- Anweisungen unterstützt werden.this
odersuper
unterstützt werden.Hmm wo kann ich es verwenden?
Kann überall eingesetzt werden Sie fühlen, ok 🙂 so einfach. Aber ich sehe die meisten der Zeit, die verwendet wird, wenn dabei die Datenbank-Verbindung, API init, - Protokollierung und etc.
Nicht nur die Rinde! wo ist das Beispiel?
Ausgang???
Hoffe, das hilft!
afterPropertiesSet()
vonInitializingBean
?Ja, Sie können! Statische Initialisierer werden aufgerufen, wenn die Klasse geladen wird, die durch die jvm. So seinen die wirklich erste phase, in denen code ausgeführt wird. Wenn Sie einen Konstruktor zu, die Reihenfolge wäre: statische Initialisierung, Konstruktor, afterPropertiesSet
Dank sehr klare Erklärung...
InformationsquelleAutor Madan Sapkota
Den
static
block ist ein "statischen Initialisierer".Wird es automatisch aufgerufen, wenn die Klasse geladen wird, und es gibt keinen anderen Weg, um es aufzurufen (auch nicht über Reflexion).
Habe ich persönlich nur einmal benutzt es beim schreiben von JNI-code:
Method
Instanz, sondern nur aufgerufen wird, die von der Java virtual machine.InformationsquelleAutor Alnitak
Dies ist direkt aus http://www.programcreek.com/2011/10/java-class-instance-initializers/
1. Die Reihenfolge Der Ausführung Von
Betrachten Sie die folgende Klasse, Sie wissen, was man bekommt zuerst ausgeführt?
Ausgabe:
2. Wie Java-Instanz-Initialisierer Arbeit?
Den Instanz-Initialisierer oben enthält eine println-Anweisung. Um zu verstehen, wie es funktioniert, können wir es behandeln, wie eine variable Zuordnung Anweisung, z.B.
b = 0
. Dies kann deutlicher machen, um zu verstehen.Statt
int b = 0
Sie schreiben könnteDaher, Instanz-Initialisierungen und Instanz-Variablen-Initialisierungen sind so ziemlich das gleiche.
3. Wenn sind Beispiel Initialisierungen nützlich?
Den Einsatz von Instanz-Initialisierungen sind selten, aber dennoch kann es eine sinnvolle alternative zum Beispiel Variablen-Initialisierungen, wenn:
Natürlich, wie code geschrieben werden kann, in Konstruktoren. Aber wenn eine Klasse mehrere Konstruktoren haben, müssten Sie wiederholen Sie den code in jedem Konstruktor.
Mit einer Instanz-Initialisierer, Sie können schreiben Sie einfach den code einmal und es wird ausgeführt, egal was Konstruktor wird verwendet, um das Objekt zu erstellen. (Ich glaube, das ist nur ein Konzept, und es ist auch nicht so oft.)
Einem anderen Fall, in dem Instanz-Initialisierungen nützlich sind, ist, anonyme innere Klassen, die sich nicht deklarieren der Konstruktoren überhaupt. (Ist dies ein guter Ort, um eine logging-Funktion?)
Dank Derhein.
Beachten Sie auch, dass die Anonymen Klassen, die interfaces implementieren [1] haben keine Konstruktoren. Daher Beispiel Initialisierungen sind notwendig, um ausführen alle Arten von Ausdrücken, die bei der Konstruktion der Zeit.
InformationsquelleAutor Alexei Fando
"final" ist gewährleistet, dass eine variable muss initialisiert werden, bevor das Ende der Objekt-Initialisierer code. Ebenfalls "static final" garantiert, dass eine variable wird initialisiert, indem das Ende der Klasse-Initialisierung-code. Das weglassen der "statische" von deiner Initialisierung code, wandelt es in Objekt-Initialisierung-code; damit die variable nicht mehr erfüllt und seine Garantien.
InformationsquelleAutor DJClayworth
Werden Sie nicht zu schreiben-code in einem static-block, der aufgerufen werden muß überall in Ihrem Programm. Wenn der Zweck des Codes aufgerufen wird, dann muss man Sie in eine Methode.
Schreiben Sie statische Initialisierer Blöcke statischen Variablen initialisieren, wenn die Klasse geladen wird aber dieser code kann komplexer sein..
Einen statischen Initialisierer block sieht aus wie eine Methode, bei der kein name, keine Argumente, und keine Rückkehr geben. Da Sie nie nennen es braucht keinen Namen. Die einzige Zeit, die genannt wird, wenn die virtuelle Maschine lädt die Klasse.
InformationsquelleAutor Vincent Ramdhanie
wenn ein Entwickler die Verwendung einer block-Initialisierer, der Java-Compiler kopiert die Initialisierung in jedem Konstruktor der aktuellen Klasse.
Beispiel:
folgenden code:
ist äquivalent zu:
Ich hoffe mein Beispiel ist verständlich von den Entwicklern.
han: Sie haben Recht.
InformationsquelleAutor cardman
Statischen code-block kann verwendet werden, zu instanziieren oder initialisieren von Klassenvariablen (im Gegensatz zu object-Variablen). Also das "eine" static bedeutet, dass nur eine gemeinsam von allen Test-Objekte, und die statische code-block initialisiert "a" nur einmal, wenn der Test-Klasse zum ersten mal geladen wird, egal wie viele Test-Objekte erstellt werden.
Wenn Sie rufen Sie eine öffentliche statische Funktion der Klasse, wird die Klasse muss zuerst geladen werden, also ja, der statische Initialisierer wird zuerst ausgeführt.
Es sei denn, es war Klasse die Initialisierung, die (indirekt) aufgerufen, der code, der versucht, es zu benutzen. IFYSWIM. Zirkuläre Abhängigkeiten und all das.
richtig ist - es ist möglich, etwas zu schreiben, wo eine statische Initialisierer ruft eine statische Methode auf, bevor ein weiterer statische Initialisierer aufgerufen wird, aber mein Verstand Rückläufe bei dem Gedanken, so dass ich nie in Erwägung gezogen.
Vielen Dank an Euch beide für die Klarstellung.
InformationsquelleAutor Paul Tomblin