首先得知道什么是初始化块:就是类中得一段用大括号 {} 括起来得独立的代码空间。
而初始化块分成了 普通初始化块静态的初始化块(也称为 静态代码块)。

下面分别来介绍一下:

一、普通初始化块:

  1. 普通初始化块是类中用一个大括号 {} 包起来的独立的代码空间,一个类中可以有多个初始化块。

  2. 普通初始化块是在创建对象时隐式调用,每次创建一个新对象实例时都会调用一次,多个普通初始化块之间,按顺序调用。

    (可以看到,先执行普通初始化块中的代码,然后再执行类的构造函数;并且每次创建对象都会执行类中的普通初始化块。)

二、静态代码块:

  1. static {} 包起来的代码,一个类中可以有多个静态代码块。

  2. 类加载时隐式调用,只执行一次。

    (可以看到,多次创建对象,但一个类的静态代码块只会执行一次。)

三、多种代码块间的执行顺序

类中既有既有静态代码块又有普通初始化块
代码块执行顺序:
静态代码块 → 普通初始化块 → 构造函数

因为要先加载类,才能创建类的对象实例,而静态代码块是在类加载时调用,而普通初始化块是在创建对象时调用,所以自然静态代码块的执行早于普通初始化块。
示例:

测试:

  1. 子父类中都有静态代码块初始化块

代码块执行顺序:
父类静态代码块 → 子类静态代码块 → 父类初始化块 → 父类构造函数 → 子类初始化块 → 子类构造函数

父类:

子类:

测试:

其他的顺序都好理解,可能有些人不理解:为什么父类的构造函数比子类的初始化块先执行?
因为如果你创建某个类的对象,而这个类具有继承关系,他必然要先执行自己父类的构造函数,然后再执行自己的构造函数,也就是说,在子类创建之前,要先执行父类的构造函数,而初始化块是在创建对象时执行,所以父类构造函数的执行也在子类的初始化块之前。


上面就是关于静态代码块的相关内容了,如果看完之后,还有相关问题的不知道,可以在评论区留下问题,会及时回答更新。

这里是猿兄,为你分享程序员的世界。

非常感谢各位优秀的程序员们能看到这里,如果觉得文章还不错的话,
求点赞👍 求关注💗 求分享👬
对我来说真的 非常有用!!!

注: 如果猿兄这篇博客有任何错误和建议,欢迎大家留言,不胜感激!