Java-Reihenfolge der Initialisierung und Instanziierung
Bin ich versucht, Stück zusammen den Prozess der Initialisierung und Instanzierung in der JVM, aber die JLS ist ein wenig stumpf auf ein paar Einzelheiten, also wenn jemand was dagegen hätte, Aufräumarbeiten einige details, es wäre zu schätzen. Dies ist, was ich in der Lage gewesen, um herauszufinden, so weit.
Initialisierung
- Rekursiv Initialisiert static final-Variablen der Klasse und deren Schnittstellen, sind compile-Zeit-Konstanten.
- Wieder aus der Rekursion-Verarbeitung statische Blöcke und statische Felder in textueller Reihenfolge.
Instanziierung
- Rekursiv Initialisiert Letzte Instanz-Variablen der Klasse sind, die compile-Zeit-Konstanten.
- Wieder aus der Rekursion-Verarbeitung von nicht-statische Blöcke und Instanz-Felder in textlicher voranstellen, um Sie in die Konstruktoren, wie es gibt.
Okay, nun also die Fragen stellen.
- sind Schnittstellen verarbeitet in der Reihenfolge der Deklaration?
- sind Schnittstellen verarbeitet in einem separaten recursive-stack?
a) wenn ja, Schnittstellen verarbeitet vor oder nach der Oberklassen?
b) wenn ja, bin ich richtig in der Aufzucht, dass der eine oder andere (Interface oder Superklasse) erhält seine nicht-compile-Zeit-Konstante Felder initialisiert, bevor die anderen compile-Zeit-Konstanten.
- Welche Rolle spielt die Aufrufe der standardmäßige super () - Konstruktor spielen in diesem Prozess?
- Täusche ich mich in irgendeiner meiner Aussagen?
- Fehlen mir andere wichtige details?
Schnittstellen public static final Felder. Wenn diese Felder sind Objekte mit einer Initialisierung (z.B.
public static final ArrayList<String> someStrings = new ArrayList<>();
) dann wäre ein Teil der Initialisierung.InformationsquelleAutor user3056052 | 2014-04-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist es wichtig zu unterscheiden, zwischen der Initialisierung der Klasse und Initialisierung eines Objekts.
Klasse Initialisierung
Einer Klasse oder Schnittstelle ist initialisiert auf ersten Zugriff, durch die Zuordnung der compile-Zeit-Konstante Felder, dann rekursiv die Initialisierung der Oberklasse (falls noch nicht initialisiert), dann die Verarbeitung der statischen Initialisierungen (die die Initialisierungen für die statischen Felder, die keine compile-Zeit-Konstanten).
Als Sie bemerkt haben, Initialisierung einer Klasse nicht von sich aus auslösen die Initialisierung der Schnittstellen, die Sie implementiert. Schnittstellen sind daher initialisiert, wenn Sie zum ersten mal aufgerufen wird, in der Regel durch das Lesen eines Feldes, das nicht zu einem compile-Zeit-Konstante. Dieser Zugang kann auftreten, während der Auswertung einer Initialisierung, wodurch eine rekursive Initialisierung.
Es ist auch erwähnenswert, dass die Initialisierung wird nicht ausgelöst, durch den Zugriff auf Felder, die compile-Zeit-Konstanten, wie diese bewertet werden bei compile-Zeit:
Objekt-Initialisierung
Ein Objekt initialisiert Wann immer ein neues Objekt erstellt wird, in der Regel durch Auswertung einer Klasse-Instanz-Erstellung-Ausdruck. Dies geht wie folgt:
Wie wir sehen können, in Schritt 3, das Vorhandensein einer expliziten Aufruf des super-Konstruktors einfach verpasst, die super-Klasse-Konstruktor aufgerufen wird.
InformationsquelleAutor meriton
Folgenden ein Beispiel, drucken Sie die Reihenfolge der einzelnen Schritte bei der Objekterstellung.
InstanceCreateStepTest.java:
Ausführung:
Nur aufrufen der main-Methode, und dann überprüfen Sie die Ausgabe.
Tipps:
@PostConstruct
nicht geltend gemacht werden, es sei denn, Sie rufen es in einige Behälter, wieSpring-boot
, da es von denen abhängt, die Container zu implementieren annotation wie@PostConstruct
.InformationsquelleAutor Eric Wang