在学习类的加载顺序的时候,static块,即静态块的执行顺序是一个重点。在面试的时候这一块也是重点区域,所以需要深入地了解静态块。
今天就来认识一下static块到底有什么样的特性,使得众多公司面试时都绕不开这一关。
我们先来了解一下静态块是什么:
static代码块也叫静态代码块,是在类中独立于类成员的static语句块,可以有多个,位置可以随便放,它不在任何的方法体内,JVM加载类时会执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。
光看文字的话一时半会也了解不深,还是老规矩,我们先上代码。
来呀! 阿福!上代码!!!!!
public class TestClass {
public static void main(String[] args) {
// TODO Auto-generated method stub
ParentClass pa = new ParentClass();
}
}
public class ParentClass {
static int num = 0;
String name = "Searchin";
static String name2 = "FunKaQiu";
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);
}
}
上文的程序定义了两个类, ParentClass类中定义了两个static变量、一个static对象、一个static块,以及一个构造函数和构造块。
大家觉得程序运行的结果会是什么呢?
按照上文中说的,static块优先级高于构造块,那么将先执行静态块中的内容,如果静态变量在定义的时候就赋给了初值(如 static int X=100),那么赋值操作也是在类加载的时候完成的,而static同级则按顺序执行。
会是这样吗?我们来看看。
运行结果:
可以看到,构造块执行了狼此,静态初始化只执行了一次。似乎没有什么问题,认真的人也许会发现,上文中说到static块的优先级比构造块和构造函数快,可为什么这里却是先执行了块一和构造函数,随后才执行的static块呢?
你知道为什么吗?先想想?
好啦,告诉你答案。
static块的优先级的确是高于构造块和构造函数,因此它会先于它们执行。但是我们知道,上文中的程序有四个static,它们同级之间按顺序执行。
也就是先定义了两个static变量,然后再定义一个static对象。随后再执行static块。
可是按这样说的话,也是先执行了static再执行别的呀,那为什么是先执行块一和构造函数呢?
问题就出在static对象这里。
static ParentClass parentClass = new ParentClass();
这语句在ParentClass类中new了一个ParentClass的实例对象parentClass,这时候按照类的加载顺序,会进入ParentClass类中进行加载。
而由于static只在类第一次加载的时候初始化一次,因此前两个static变量由于之前已经加载过一次了,因此这里不会加载。
在TestClass类中第一次实例化ParentClass对象,此时进行第一次加载。
static ParentClass parentClass = new ParentClass();
因此当在new parentClass的时候,带有static的都不会加载。
它只会执行块一和构造函数。执行完之后再返回,这个时候才轮到static块执行。因此会出现上面的输出结果。
好啦
通过上面的程序我们初步了解了static的特性,我们可以再思考一个问题,如果我把static ParentClass parentClass = new ParentClass();这个语句中的static去掉,那么将会程序运行结果会是怎么样的呢?
......
好啦,我们运行一下试试看。
可以发现,这里先执行了static块,随后再执行new parentClass,而new 的过程中又会嵌套地new下一个parentClass,这样就造成了死循环,因此它会报“StackOverflowError”的语句。
可能有人会问,为什么刚才有static的时候就不会进入死循环啦?
哈哈,因为static只在类第一次加载的时候执行一次呀~~
好啦,以上就是static块执行顺序的相关内容,如果大家发现文中有什么描述不对的地方,欢迎大家留言评论,我们一起学习呀~~
Biu~~~~~~