java版本:jdk1.8
IDE:idea 18
如下:
当子类被实例化时,执行顺序是这样的:
父类静态代码块=>子类静态代码块=>父类构造代码块=>父类构造函数=>子类构造代码块=>子类构造函数
当代码块有多个时,则按照书写顺序执行。
由于代码块是没有名字的,所以只会被自动执行,而且只执行一次,无法手动执行(区别于普通的方法和普通的静态方法)。
静态代码块不管类被实例化几次(包括子类),它都只会被执行一次,也就是说,在整个java程序运行环节,静态代码块里的代码,只会被执行一次。而构造代码块被执行的次数,取决于类和它的子类被实例化的次数,每实例化一次,就被执行一次。
在整个程序运行周期里,如果某个类未被使用,那么,它就不会被加载,也就不会执行它的静态代码块。
静态代码块和构造代码块,由于执行得比较早,所以常用于初始化类。具体该不该使用,要根据实际情况来衡量。
静态代码块只需要类被装载时就会被执行,因此如果你调用类中的静态方法,比如本例中的Test方法,它的静态代码块也会被执行,而不需要实例化类。静态代码块是先于构造函数执行的,因此无法使用该类中的非静态成员,这个编译器会提醒你,并不需要特别注意。我们需要关注的是它的使用场景,在使用之前要慎重考虑下用它是否合理,是否有更好的方案,毕竟放到spring大行其道的当下,用spring给你提供好的方案来解决加载前初始化的问题,是否更合理些。另外c#是没有这两个东西的,我们知道c#的设计是借鉴java的,那么它用什么来代替这两个功能呢,答案是静态构造函数。二者在功能上是大抵相同的。