2016-05-19 8 views
8

Uczę się funkcji bloku statycznego w rdzeniu Java.Dlaczego blok statyczny klasy Child nie jest wykonywany, gdy uzyskuje się dostęp do Child.name?

public class ClassResolution { 
    static class Parent { 
     public static String name = "Sparsh"; 
     static { 
      System.out.println("this is Parent"); 
      name = "Parent"; 
     } 
    } 

    static class Child extends Parent { 
     static { 
      System.out.println("this is Child"); 
      name = "Child"; 
     } 
    } 

    public static void main(String[] args) throws ClassNotFoundException { 
     System.out.println(Child.name); 
    } 
} 

Myślałem wyjście byłoby:

this is Parent 
this is Child 
Child 

ale rzeczywisty wynik jest:

this is Parent 
Parent 

i nie mam pojęcia dlaczego.

+1

widziałem to, ale mają jeszcze pytanie dlaczego „dziecko” nie dostać wydrukować – sparsh610

+0

zobaczyć https://ideone.com/tnBVKJ podczas korzystania 'Child.name' nie zainicjować 'Child' klasa –

+0

@ YassinHajaj To nie jest duplikat - sytuacja jest inna. – glglgl

Odpowiedz

14

Od name jest statycznym polu zadeklarowane w Parent klasy dostępu do niego w sposób main (chociaż jest ona dostępna przy użyciu nazwy Child klasy jako przedrostek) powoduje Parent klasa zostać zainicjowany. Child klasa nie została zainicjalizowana.

Dlatego jest wyświetlany (od statyczny blok inicjujący z Parent jest wykonywany) "this is Parent", "this is Child" jest nie wyświetlona (ponieważ statyczny blok inicjujący z Child jest nie wykonywane) i drukowane wartość name jest "Parent".

Oto istotne odniesienie JLS:

12,4. Inicjowanie klas i interfejsów

Inicjowanie klasy polega na wykonywaniu jej inicjatorów statycznych i inicjalizatorów dla pól statycznych (zmiennych klasy) zadeklarowanych w klasie.

Inicjalizacja interfejsu polega na wykonaniu inicjalizatorów dla pól (stałych) zadeklarowanych w interfejsie.

12.4.1. Podczas inicjalizacji Występuje

klasy lub interfejs typu T zostanie zainicjowany bezpośrednio przed pierwszego wystąpienia jednego z następujących:

  • T klasy i instancją T jest utworzony.

  • Wywoływana jest metoda statyczna zadeklarowana przez T.

  • Pole statyczne zadeklarowane przez T jest przypisane.

  • Stosowane jest pole statyczne zadeklarowane przez T, a pole nie jest zmienną stałą (§4.12.4).

  • T jest klasą najwyższego poziomu (§7.6) i wykonywana jest instrukcja assert (§14.10) leksykalnie zagnieżdżona w T (§8.1.3).

Powiązane problemy