当你用Java运行文件的时候,第一件事情就是访问main()(这是一个static方法),于是装载器就会为你寻找经编译的类的代码。在装载的过程中,装载器注意到它有一个基类(也就是extends所要表示的意思),于是它再装载基类。不管你创不创建基类对象,这个过程总会发生。
如果基类还有基类,那么这第二个基类也会被装载,以此类推。下一步,它会执行“根基类”的static初始化,然后是下一个派生类static初始化,以此类推。这个顺序非常重要,因为派生类的“静态初始化”有可能要依赖基类成员的正确初始化。
现在所有的类都已经装载结束,可以创建对象了。首先,对象里的所有的primitive都会被设成它们的缺省值,而reference也会被设成null——这个过程是一瞬间完成的,对象的内存会被统一地设置成“二进制的零”。然后调用基类的构造函数。调用是自动发生的,但是你可以使用super来指定调用哪个构造函数(也就是构造函数所做的第一件事情)。基类的构造过程以及构造顺序,同派生类的相同。基类构造函数运行完毕之后,会按照各个变量的字面顺序进行初始化。最后会执行构造函数的其余部分。