实例变量每次new对象时都会被初始化,包括默认初始化、定义时赋值、非静态初始化块和构造器赋值,三者按源码顺序合并执行;静态变量仅在类加载时初始化一次。

是的,实例变量在每次 new 对象时都会被初始化。
这是因为实例变量属于对象级别,每个对象都有自己独立的一份副本。只要创建新对象,JVM 就会为它分配新的内存空间,并执行完整的实例初始化流程——包括默认初始化、显式初始化(定义时赋值)、非静态初始化块、以及构造器中的赋值。
这和静态变量完全不同:静态变量只在类加载时初始化一次,与对象数量无关。
实例变量初始化的三个来源(按执行顺序混合进行)
定义时直接赋值
比如private String name = "default";
这行代码会被编译器“挪”进构造器中,在构造器开头附近执行。非静态初始化块(实例初始化块)
形如{ System.out.println("init"); age = 18; }
它不依赖构造器名,但每次new都会执行,且按其在类中出现的位置,与字段初始化穿插执行。构造器中赋值
比如this.name = name;
构造器是最后一步,它的赋值会覆盖前面所有同名变量的赋值。
✅ 关键点:这三者不是“先后分阶段”,而是按源码文本顺序合并到构造器里统一执行。谁写在前面,谁先运行。
举个直观例子
class Person {
{ System.out.println("A: init block"); age = 20; }
int age = 25;
{ System.out.println("B: init block"); age = 30; }
Person() { System.out.println("C: constructor"); age = 35; }
}
执行 new Person() 输出:
A: init block B: init block C: constructor
最终 age = 35 —— 因为构造器赋值在最后。
注意别混淆:静态初始化只执行一次
static { ... } 块或 static int x = 10; 是类加载时执行,不管 new 多少次,只运行一次。
而上面提到的所有实例相关初始化,只要 new 一次,就全走一遍。
不复杂但容易忽略











