Both of you are right in my opinion. Craig is right in that the JLS does state the code should behave as it does, and this fact is borne out by the actual behaviour exhibited. And Richard is right in that the behavior is weird and does not do what seems intuitive or obvious -- it violates the "principle of least surprise."
What I see as the main problem here, however, is the design and interplay of the classes and how they are initialized -- particularly the fact that the superclass' constructor calls abstract or overridable methods. Calling overridable methods during constructors is generally a dangerous proposition. PMD even has a check for this. Their explanation for this check states:
Calling overridable methods during construction poses a risk of invoking methods on an incompletely constructed object. This situation can be difficult to discern. It may leave the sub-class unable to construct its superclass or forced to replicate the construction process completely within itself, losing the ability to call super(). If the default constructor contains a call to an overridable method, the subclass may be completely uninstantiable. Note that this includes method calls throughout the control flow graph - i.e., if a constructor Foo() calls a private method bar() that calls a public method buz(), there's a problem.
A better solution would be to avoid the confusion entirely and rethink the way your class hierarchy is set up and how the instances are created. Creational patterns like factory and builder may be better suited here.
Both of you are right in my opinion. Craig is right in that the JLS does state the code should behave as it does, and this fact is borne out by the actual behaviour exhibited. And Richard is right in that the behavior is weird and does not do what seems intuitive or obvious -- it violates the "principle of least surprise."
What I see as the main problem here, however, is the design and interplay of the classes and how they are initialized -- particularly the fact that the superclass' constructor calls abstract or overridable methods. Calling overridable methods during constructors is generally a dangerous proposition. PMD even has a check for this. Their explanation for this check states:
A better solution would be to avoid the confusion entirely and rethink the way your class hierarchy is set up and how the instances are created. Creational patterns like factory and builder may be better suited here.