今天学习了类的加载顺序,而这一块比较特殊的便是static静态块。静态语句块,优先对象存在,也就是优先于构造方法存在,我们通常用来做只创建一次对象使用。因此在加载时,优先执行静态块语句。
public class TestClass {//类为TestClass的方法
public static void main(String[] args) {
// TODO Auto-generated method stub
ParentClass pa = new ParentClass();
}
}
public class ParentClass {//类为ParentClass的方法
static int num = 0;
String name = "Searchin";
static String name2 = "Searchin2";
static ParentClass parentClass = new ParentClass();
ParentClass(){
System.out.println("这里是构造函数*************");
}
{
System.out.println("name1:" + name);
System.out.println("这里是块1============");
}
static {
num += 1;
System.out.println("name2:" + name2);
System.out.println("这里是静态初始化块*************" + num);
}
}
此程序执行结果为:
为什么会是这样的执行结果呢?
首先因为static静态块的特殊性,他首先执行,
程序中有四个静态块,所以依次执行。在执行static ParentClass parentClass = new ParentClass();时,此函数重新调用,而由于static只在类第一次加载的时候初始化一次,所以在第一次执行后,就不再执行。而构造块优先级比构造函数要高。所以执行了构造块。然后再执行构造函数。输出了前两个值。此时static ParentClass parentClass = new ParentClass();已经执行完成。接着执行下一个静态快函数 ,输出:
name2:Searchin2
这里是静态初始化块*************
此时静态块已经完全执行完了,执行非静态块,
{
System.out.println("name1:" + name);
System.out.println("这里是块1============");
}
ParentClass(){
System.out.println("这里是构造函数*************");
}
最后输出如上结果。