The Java compiler should not treat java.lang.Object differently than any other base class, which probably has a more complex default constructor. Therefore, the constructor of the base class must be executed from the constructor of any subclass. This byte code is also safe for future modifications to the base class (including Object ): if someone changes the base class on some day, the subclass code should not be recompiled.
BTW changes in the base class, including Object, are not so exotic: think of tooling packages. If you want to use the JDK and, for example, count the entire created object, you want to change the bytecode java.lang.Object . Now, if the bytecode does not contain a call to the Object constructor, your tool code just won't run.
source share