Warum wird der statische Block der Klasse Child nicht ausgeführt, wenn auf Child.name zugegriffen wird? [Duplikat]

8

Ich lerne die statische Blockfunktionalität in Core Java.

%Vor%

Ich dachte, die Ausgabe wäre:

%Vor%

aber die tatsächliche Ausgabe ist:

%Vor%

und ich habe keine Ahnung warum.

    
sparsh610 19.05.2016, 05:33
quelle

1 Antwort

14

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.

  •   
    
Eran 19.05.2016, 05:45
quelle

Tags und Links