java中构造函数只能通过new或反射调用,不能直接调用;静态代码块在类加载时执行,可合法使用new创建实例从而触发构造函数,但不可访问非静态成员,且需注意初始化顺序与副作用。

可以,但需要通过 new 表达式显式调用,不能直接“调用”构造函数。
静态代码块在类加载时执行,属于类级别初始化阶段。它本身不创建对象,但允许使用 new 创建实例,从而间接触发构造函数执行。这本质上是“在静态代码块里实例化对象”,而非“调用构造函数”这一语法动作——Java 中构造函数永远只能通过 new(或反射)触发,不能像普通方法那样被直接调用。
静态代码块中创建对象是合法且常见的
public class Example {
static {
System.out.println("静态代码块开始");
new Example(); // ✅ 合法:new 会触发构造函数
System.out.println("静态代码块结束");
}
public Example() {
System.out.println("构造函数执行");
}
public static void main(String[] args) {
// 输出顺序:
// 静态代码块开始
// 构造函数执行
// 静态代码块结束
}
}
- 这里
new Example()是一条语句,它导致:- 类加载 → 执行静态代码块;
-
new触发对象创建 → 执行构造代码块(如有)→ 执行构造函数。
注意事项
-
不能直接写
Example()—— 这不是方法调用,编译报错。 -
不能访问非静态成员:静态代码块内不可直接访问
this、实例变量或实例方法。 -
慎用:可能引发意外初始化
比如构造函数依赖尚未初始化的静态字段,或触发未预期的副作用(如重复注册、资源提前占用)。 - 适合场景有限:一般用于初始化单例、预热缓存、加载默认配置对象等,且该对象生命周期明确、无复杂依赖。
和其他初始化机制的关系
- 静态代码块只执行一次,早于任何对象创建;
- 每次
new都会走完整流程:构造代码块 → 构造函数; - 若在静态块中
new多次,就会多次执行构造代码块和构造函数。
例如:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
static {
new Example(); // 第一次
new Example(); // 第二次
}
会输出两遍“构造函数执行”。
不复杂但容易忽略:静态代码块里能 new,本质是利用了 new 的语法特性,而不是绕过 Java 对象创建规则。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










