Java——static静态块的执行顺序

 在学习类的加载顺序的时候,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~~~~~~

猜你喜欢

转载自blog.csdn.net/Searchin_R/article/details/83178561
今日推荐