I'm not an xpert but I'll try to help anyway. Please correct me if my explanation is wrong, thanks.
In the snippet of code, consider: the superclass called Super, the subclass called
Test and the printThree() in Test (which is a legal override of printThree() in Super.).
When you run "java Test" happens that the main() method inside Test is called and a new object of type Test starts his life in this way:
1. Test() constructor is invoked
This is the code for default constructor Test() that the compiler implicitly provides even if you don't type it:
2. Superclass' no-args constructor first implicitly invokes Object's default constructor, and this has no "visible" effects, then invokes printThree() method. As printThree() has been overridden, it is important to note that (as JLS says) the code:
is *not* executed. Instead the version that will be invoked is the one in Test class (JLS says that).
This ends the preamble. JLS should now be more clear:
If methods are invoked that are overridden in subclasses in the object being initialized, then these overriding methods are used, even before the new object is completely initialized. This shows that the invocation of printThree in the constructor for class Super does not invoke the definition of printThree in class Super, but rather invokes the overriding definition of printThree in class Test. This method therefore runs before the field initializers of Test have been executed, which is why the first value output is 0, the default value to which the field three of Test is initialized.