java基础——静态代码块、构造代码块、构造函数执行顺序

时间:2022-08-07 19:27:52

静态代码块、构造代码块、构造函数执行顺序


1.静态代码块的格式

static {
      //执行语句
}

特点:随着类的加载而执行,只执行一次,并优先于主函数,用于给类初始化的。


2.构造代码块的格式:

{

 //执行语句

}

 作用:给对象进行初始化。对象一建立就运行。
 

3.构造函数的格式:

class 类名{

  类名(){

  }

}

它和构造代码块的区别:构造代码块是给所有对象进行统一初始化,而构造函数是给对应的对象初始化。

下面来看看这几个部分的执行顺序是什么样的:

class StaticCode
{
	StaticCode() //无参构造函数
	{
		System.out.println("b");
	}
	//静态代码块
	static
	{
		System.out.println("a");
	}
//构造代码块
	{
		System.out.println("c");
	}
	//带参的构造函数
	StaticCode(int x)
	{
		System.out.println("d");
	}
	
}

接下来写一个测试类

class  Test //测试类
{
	public static void main(String[] args) 
	{
		new StaticCode(5);//当执行这段代码时,我们发现执行结果为a->c->d
	}
}

从这我们就可以看出了,代码的执行顺序是从静态代码块-->构造代码块-->构造函数。

为什么会这样呢?

我们发现,静态代码块存储在内存中的方法区,当我们加载一个类时,它就会加载到这块内存中,并会随着类的消失而消失,生命周期很长。接着,我们new操作,会在堆内存中生成一个对象,它是在static之后存在的。而且,会首先执行构造代码块,构造代码块是不同对象共性的初始化内容,接着执行带参数的构造方法。我们就会看到测试类会打印出 a c d 为顺序的结果。

当测试类变为下列情况时:

class  Test
{
	public static void main(String[] args) 
	{
		//new StaticCode(5);
		new StaticCode();
		new StaticCode();
	}
}


此时打印出的结果为:a c b c b,可以看到a只打印了一次,也就是说静态代码块只会执行一次。