Da name
ein statisches Feld ist, das in der Klasse Parent
deklariert ist und auf es in der Methode main
zugreift (obwohl es mit dem Klassennamen Child
als Präfix aufgerufen wird), ist Parent
class initialisiert. Child
class ist nicht initialisiert.
Daher wird "this is Parent"
angezeigt (da der statische Initialisierungsblock von Parent
ausgeführt wird), "this is Child"
wird nicht angezeigt (da der statische Initialisierungsblock von Child
ist nicht ausgeführt) und der gedruckte Wert von name
ist "Parent"
.
Hier ist die relevante JLS-Referenz:
12.4. Initialisierung von Klassen und Interfaces
Die Initialisierung einer Klasse besteht aus der Ausführung ihrer statischen Initialisierer und Initialisierer für statische Felder (Klassenvariablen) in der Klasse deklariert.
Die Initialisierung einer Schnittstelle besteht aus der Ausführung der Initialisierer für Felder (Konstanten), die in der Schnittstelle deklariert sind.
12.4.1. Wenn Initialisierung auftritt
Eine Klasse oder ein Schnittstellentyp T wird unmittelbar vor dem Aufruf der Klasse initialisiert erstes Vorkommen von einem der folgenden:
T ist eine Klasse und eine Instanz von T wird erstellt.
Eine von T deklarierte statische Methode wird aufgerufen.
Ein statisches Feld, das von T deklariert ist, wird zugewiesen.
Ein durch T deklariertes statisches Feld wird verwendet und das Feld ist keine konstante Variable (§4.12.4) .
T ist eine Top-Level-Klasse (§7.6) und eine Assert-Anweisung (§14.10), die lexikalisch in T (§8.1.3) verschachtelt ist, wird ausgeführt.
Tags und Links java