Before java can execute any code those classes should be loaded in to JVM first. When a class is to be loaded if that class extends any other classe(s) those should be loaded prior to that (one at the top of the hierarchy will be loaded first and then down the hierarchy, in the order). When the class is loaded it's static initializers are run. And last when an instance of the class is created it's instance initializers are run in the order they appear in the class file. For a comprehensive explanation you may refer the JLS .