实例初始化器语法是一个特殊的代码块,包含在类中的花括号中,但不在方法和构造函数内。这个块称为实例初始化器块。它在每次创建新对象时执行,恰好在调用父类构造函数后和执行当前类构造函数代码之前。
public class Example { { // 实例初始化器块 System.out.println("实例初始化"); } private int x; public Example(int x) { this.x = x; System.out.println("构造函数"); } }
实例初始化器适用于:
如果类中同时存在实例初始化器和构造函数,会发生什么?执行顺序如何?
答案: 首先执行实例初始化器,然后执行构造函数代码。如果类中有多个实例初始化器块,则按照它们的描述顺序执行。
示例:
public class Demo { { System.out.println("实例初始化器 1"); } public Demo() { System.out.println("构造函数"); } { System.out.println("实例初始化器 2"); } } // new Demo() 时的输出: // 实例初始化器 1 // 实例初始化器 2 // 构造函数
历史
在一个项目中,开发者将逻辑放在实例初始化器中,而不是方法或构造函数中。在继承类并重载构造函数时,实例初始化器仍然执行,这导致初始化顺序意外以及业务逻辑错误。
历史
在另一个项目中,实例初始化器试图访问在代码下方初始化的类字段。结果,变量尚未初始化,在创建对象时发生了NullPointerException。
历史
团队在实例初始化器中添加了与外部资源(数据库)相关的操作。因此,每次调用构造函数都建立了一个数据库连接,这在批量创建对象时导致系统过载。