先上结论:
第一,静态代码块>构造代码块>构造函数>普通代码块
1 静态代码块
静态代码块是static关键字和{}声明的代码块,形如:
public class Test{ static{ System.out.println("静态代码块"); } }
1.它在类被加载的时候就运行了,只运行一次,优先于所有其他的代码块。
2.在项目中,很多时候需要在项目启动的时候,就预先加载一些资源,比如初始化配置等。
3.静态代码块中不能访问普通变量。
2 构造代码块
构造代码块直接用{}声明。形如:
public class Test{ static{ Sysytem.out.println("静态代码块"); } { System.out.println("构造代码块"); } }
1.它在创建对象的时候就被调用,并且每次创建对象都会调用一次,优先级低于静态代码块,高于构造函数(其实这样的说法不太对,从最后的结果来说是先构造函数运行的,其实它是依托于构造函数的)。
注意:静态代码块是在整个项目中只运行一次,对于一个对象类来说,一个项目中可能要创建多次,但是它只运行一次。而构造代码块是没创建一次就运行一次,这一点和构造函数相同。
3 构造函数
这个其实大家很熟悉了,如下:
public class Test{ Test(){ System.out.println("无参构造函数"); } Test(int x){ System.out.println("有参构造函数"); } }
1.首先每个类都有一个构造函数,而且构造函数的名字必须和类名完全相同。当然在java中普通函数也是可以和构造函数同名的,不过必须带有返回值。这也侧面说明了构造函数是不能有返回值的。
2.每个类至少有一个构造函数,可以有多个构造函数,不过其参数必须不同。构造函数分为无参和有参。当写一个类的时候,如果没有写构造函数,那么java编译器会自动给它加一个隐式的无参构造函数。
3.构造函数优先于其他普通函数,在类创建的时候自动运行,而且不能被调用。
4 运行顺序
开头提到静态代码块>构造代码块>构造函数>普通代码块。我们从下面的例子说明;
public class Test{ static{ System.out.println("静态代码块"); } { System.out.println("构造代码块"); } Test(){ System.out.println("无参构造函数"); } Test(int x){ System.out.println("有参构造函数"); } public void show(){ System.out.println("普通函数") } public static void main(String[] args){ new Test(); System.out.println("**********"); new Test(4); } }
输出结果:
静态代码块 构造代码块 有参构造函数 ********** 构造代码块 无参构造函数
从结果可以看出静态代码只运行了一次,并且最先运行;
构造函数依托于构造函数,在每次创建对象时运行,并且优于构造函数运行。
参考博客:https://www.cnblogs.com/ysocean/p/8194428.html#_labelTop