1.首先需要肯定的是静态类成员变量、静态方法和静态块是属于类的,而不属于单个类对象。随着第一个类的创建之初就已经存在。
2.子类继承父类时,对子类进行实例化,需要先创建父类实例后才会创建子类实例。
3.创建父类的时候,如果静态成员变量和静态块同时存在的话,要先创建静态成员变量,后创静态块,再运行构造器。
运行结果为
4.当父类这些运行完毕以后,接着初始化子类中的静态成员和静态块。随后再执行父类的构造器,初始化父类普通成员变量和方法,最后初始化子类中的成员变量和方法。
运行结果为:
5.那静态方法是在什么时候初始化的呢?修改上面的主函数为
其结果如下:
直接使用静态方法之前,静态变量就已经存在了,且静态块已经完成的赋值运算。说明静态方法是在静态块之后、构造器之前运行的。
6.总结如下:
类初始化对象其运行的先后顺序为:父类中的静态成员变量、父类中的静态块、父类中的静态方法、子类中的静态成员变量、子类中的静态块、子类中的静态方法、父类的构造器、父类中的普通成员变量、父类中的普通方法、子类构造器、子类普通成员变量、子类中的普通方法。父类的构造器实际是通过super()套用在子类的构造器之中。