Java中构造方法,构造代码块和静态代码块执行顺序详解
Java中构造方法,构造代码块和静态代码块执行顺序详解
前言:
构造方法,构造代码块和静态代码块的执行顺序是一个常见的面试题,精通Java的人都知道执行顺序为:“静态代码块——>构造方法——>构造代码块”,接下来对该顺序进行详细分析
分析:
1.构造方法的执行:
所有的Java类中至少都会有一个构造方法,用于对象的初始化。
2.构造代码块的执行:
构造代码块是类中编写的一个代码块成员,它与构造方法不同,如下图所示:
我们定义一个对象后执行代码,结果如下:
从上图我们可以发现,构造代码块的执行早于构造方法。
实际上,构造代码块和构造方法执行的时机都很类似,甚至可以说功能上是重复的,那为什么还要使用构造代码块呢?是因为构造方法一般有很多种,比如无参构造,一参构造,二参构造等等,而有些操作是不论我们使用哪种构造方法都需要使用的,那么这时候使用构造代码块来放置这些操作,便不会因为构造方法太多而多次编写同样的操作,节省了我们的精力。
3.静态代码块的执行:
如上图,静态代码块由static修饰,我们知道,在Java中,使用static修饰的成员属性和成员方法,是独立于具体的变量和具体的方法的,它们并不是随着对象的创建而创建,而是在类加载时便已经初始化,换言之,可以将静态成员、静态方法和静态代码块看成是“属于类的”,只要类被加载出了,它们便可以被我们访问,也正因此,无论其他对象创建多少次,创建多少份数据,静态成员和方法均只有一份数据。
进一步使用类比理解,我们可以将类和对象分别类比为图纸和依照图纸制造的实物。例如:类对应宝马汽车的图纸,对象对应为某辆宝马汽车,而静态修饰的属性可以看做是类的属性,也就是图纸的属性,将之类比为记录图纸使用次数的电脑;非静态修饰的属性我们看做是对象的属性,将之类比为宝马的方向盘。
在制造宝马的时候,图纸被不断地使用,但是不论图纸如何使用,记录图纸使用次数的电脑都只有一台,而宝马不断制造时,每一辆宝马都有一个方向盘,也就是说,static修饰的部分并不会随着新对象的创建(新宝马的制造)而建立新的数据(使用新的电脑),而非static修饰的部分会随着新对象的创建(新宝马的制造)而建立新的数据(新的方向盘)。
图解:
定义一个类,同时定义其静态代码块,构造代码块和构造方法如图:
定义三个相应的对象,执行结果如图:
总结:
构造代码块,构造方法和静态代码块的执行顺序是:
静态代码块——>构造代码块——>构造方法
并且我们可以注意到,构造代码块和构造方法随着每一次对象的创建而执行,但静态代码块只随着类的加载而执行,由于类只加载一次,因此静态代码块也只加载一次。
构造代码块和构造方法随着每一次对象的创建而执行,但静态代码块只随着类的加载而执行,由于类只加载一次,因此静态代码块也只加载一次。