划重点:
1.static所定义的对象只会被初始化一次;
2.static初始化发生之处,同时也是类初次使用之处;
3.类只有在初次被使用时才加载;
4.所有static对象及static代码段会在加载时依程序中书写顺序依次初始化。
接下来,我们写一个Demo,验证一下:
首先,创建一个父类Clothes

然后,创建Jacket类,继承于Clothes

从代码可以看出,线程启动,首先会访问执行Jacket类中static修饰的main方法,于是加载器开始启动,并寻找加载Jacket.class,在这一过程中,编译器会发现它有一个父类,也称基类。如果Clothes还有父的话,编译器会继续向上找,因为导出类(子类)的static初始化可能会依赖于基类中成员是否会被正确初始化。
自根基开始向下扩散加载完成后,就可以创建对象了。
对象中所有基本类型成员被赋予默认值,对象成员引用被指向为null,然后基类构造器被调用,类似于上述加载顺序,实例变量被逐步初始化。
从执行结果来看,确实如此。

大家可能会发现,通常在没有主线程作为入口的类中,在调用构造器的时候,就完成了类的加载;这是因为构造器本身就是一个含有隐式static的方法,所以文章开头的说法是没错的。