Well, the first thing you have to know is that the term of "class loading" is differ than the term of "object instantiation"; that is why there are two blocks as static-blocks and regular-blocks.
Class loading have nothing to do with initialization, and hence it doesn't need to run a constructor. Assume a class which has a single STATIC variable named "x". Do I need to instantiate that class by it's constructor in order to access that variable? The answer is, no, you don't. Simply you can access the variable through the class name. Just like,
MyClass.x (No need to create an object of MyClass). This can be done, because the MyClass class is already *loaded* to the memory. If it is not already loaded, the invocation of the expression
MyClass.x will cause the class to be "loaded".
This "loading" process will be done by the JVM, and especially
java.lang.ClassLoader is mainly responsible for that loading process. Please note that this "loading" will not create an object of the class (no constructor access). It just loads the STATIC members of the class (static variables, static methods, static inner classes...) to the memory. In addition to that, more importantly, it also loads all of the static members in the super class, and all of the static members in implemented interfaces (if any) of MyClass.
When considering the expression
MyClass.x (where x is a static variable), it requires that class to be loaded in to the memory before you can access it. Therefore if the class is not already loaded, it will give an order to the JVM to load this class. While this loading, it loads all of the static members of this class (static members only), as I described above. That is why that the expression
MyClass.x is legal.
For more information, this class "loading" process will be done with the FIRST ACCESS of the class. Therefore, even though you didn't access a static member of the MyClass class, just the instantiation of the MyClass class (i.e.
new MyClass();) will cause the MyClass to be loaded.
Now let's have a look at the Hawk class. This class has a main method, and as all of you know, that method will be called by the JVM, when you 'run' the program. Main method is a static method. So, BEFORE the main method can be called, it is required to "load" the Hawk class. As I described above, it also loads all of it's super classes, and all implemented interfaces, if any. And thus due to the class hierarchy Bird -> Raptor -> Hawk classes (it's static members) will be loaded, BEFORE the main method is called. (Again, this ‘loading’ process has nothing to do with object instantiation).
Since a regular initialization block will be called with the object instantiation process, the static block, what do you call "static initialization block" will be called with this class loading process. Therefore all of the static blocks in Bird class, Raptor class and then Hawk class will be called, BEFORE calling the main method.
HTH
Devaka