[java]类加载后main方法/静态成员变量/静态代码块/非静态代码块执行顺序

版权声明:转载或者引用本文内容请注明来源及原作者 https://blog.csdn.net/a755199443/article/details/88808026

先给出代码,大家可以先思考一下将会打印什么内容:

public class StaticTest {
	public static void main(String[] args) {
		staticFunction();
		System.out.println("main中b:"+b);
	}
	static StaticTest staticTest=new StaticTest();
	static {
		System.out.println(1);
	}
	{
		System.out.println(2);
	}
	StaticTest(){
		System.out.println(3);
		System.out.println("a="+a+"b="+b);
	}
	private static void staticFunction() {
		System.out.println(4);
	}
	int a=100;
	static int b=200;
}

思考…
思考…
时间到,结果为:
在这里插入图片描述
有没有出乎大家的意料呢.

代码中从头到尾依次是
main方法
静态成员变量
静态代码块
非静态代码块 (创建一个对象的时候就调用一次非静态代码块,执行顺序在构造器之前)
构造器
私有静态成员方法
成员变量
静态变量

static修饰的属性从上到下依次赋值,虽然main方法也是static修饰,但是main方法比较特殊,会在最后执行,因此先放一边.
在这里插入图片描述
(参考博客:https://www.cnblogs.com/greatfish/p/5771548.html)
为了赋值给 staticTest,需要先创建StaticTest对象,调用构造器之前会先调用非静态代码块 (创建一个对象的时候就调用一次非静态代码块,执行顺序在构造器之前),第一次打印,打印2.

随后调用构造器,第二次打印,打印3,接着执行System.out.println(“a=”+a+“b=”+b)语句,成员变量a已在创建过程完成了赋值,而静态变量b虽然已经在堆中开辟了内存空间,但是因为位置在最后一个static还没有进行赋值,此时仍为初始值0,所以第三次打印,打印a=100b=0.
完成赋值,执行静态代码块,第四次打印,打印1.
接着给静态变量b赋值为200,最后开始执行main方法,调用了私有静态方法staticFunction,第五次打印,打印4.最后第六次打印,打印main中b:200.

猜你喜欢

转载自blog.csdn.net/a755199443/article/details/88808026