静态代码块、构造代码块、构造函数执行顺序
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只打印了一次,也就是说静态代码块只会执行一次。