Java中构造方法,构造代码块和静态代码块执行顺序详解

Java中构造方法,构造代码块和静态代码块执行顺序详解

前言:

构造方法,构造代码块和静态代码块的执行顺序是一个常见的面试题,精通Java的人都知道执行顺序为:“静态代码块——>构造方法——>构造代码块”,接下来对该顺序进行详细分析

分析:

1.构造方法的执行:

​ 所有的Java类中至少都会有一个构造方法,用于对象的初始化。
Java中构造方法,构造代码块和静态代码块执行顺序详解

2.构造代码块的执行:

​ 构造代码块是类中编写的一个代码块成员,它与构造方法不同,如下图所示:
Java中构造方法,构造代码块和静态代码块执行顺序详解
​ 我们定义一个对象后执行代码,结果如下:
Java中构造方法,构造代码块和静态代码块执行顺序详解
​ 从上图我们可以发现,构造代码块的执行早于构造方法。

​ 实际上,构造代码块和构造方法执行的时机都很类似,甚至可以说功能上是重复的,那为什么还要使用构造代码块呢?是因为构造方法一般有很多种,比如无参构造,一参构造,二参构造等等,而有些操作是不论我们使用哪种构造方法都需要使用的,那么这时候使用构造代码块来放置这些操作,便不会因为构造方法太多而多次编写同样的操作,节省了我们的精力。

3.静态代码块的执行:

Java中构造方法,构造代码块和静态代码块执行顺序详解

​ 如上图,静态代码块由static修饰,我们知道,在Java中,使用static修饰的成员属性和成员方法,是独立于具体的变量和具体的方法的,它们并不是随着对象的创建而创建,而是在类加载时便已经初始化,换言之,可以将静态成员、静态方法和静态代码块看成是“属于类的”,只要类被加载出了,它们便可以被我们访问,也正因此,无论其他对象创建多少次,创建多少份数据,静态成员和方法均只有一份数据。

​ 进一步使用类比理解,我们可以将类和对象分别类比为图纸和依照图纸制造的实物。例如:类对应宝马汽车的图纸,对象对应为某辆宝马汽车,而静态修饰的属性可以看做是类的属性,也就是图纸的属性,将之类比为记录图纸使用次数的电脑;非静态修饰的属性我们看做是对象的属性,将之类比为宝马的方向盘。

​ 在制造宝马的时候,图纸被不断地使用,但是不论图纸如何使用,记录图纸使用次数的电脑都只有一台,而宝马不断制造时,每一辆宝马都有一个方向盘,也就是说,static修饰的部分并不会随着新对象的创建(新宝马的制造)而建立新的数据(使用新的电脑),而非static修饰的部分会随着新对象的创建(新宝马的制造)而建立新的数据(新的方向盘)。

图解:

​ 定义一个类,同时定义其静态代码块,构造代码块和构造方法如图:

Java中构造方法,构造代码块和静态代码块执行顺序详解

​ 定义三个相应的对象,执行结果如图:
Java中构造方法,构造代码块和静态代码块执行顺序详解

总结:

​ 构造代码块,构造方法和静态代码块的执行顺序是:

​ 静态代码块——>构造代码块——>构造方法

​ 并且我们可以注意到,构造代码块和构造方法随着每一次对象的创建而执行,但静态代码块只随着类的加载而执行,由于类只加载一次,因此静态代码块也只加载一次。
构造代码块和构造方法随着每一次对象的创建而执行,但静态代码块只随着类的加载而执行,由于类只加载一次,因此静态代码块也只加载一次。