为何Java代码中变量未声明即可赋值?以TestStatic类为例
关于Java静态代码块与静态变量的常见疑惑解答
首先看测试代码:
public class TestStatic{ static {a=2;} static int a=1; static int b=3; static {b=4;} public static void main(String[] args){ System.out.println(a); System.out.println(b); } }
运行输出:
1 4
疑问1:为什么静态代码块里提前给a赋值不报错?
Java类的作用域是整个类级别的,编译器在处理类时会先扫描并登记所有静态成员的声明,不管它们在代码里的书写顺序。
换句话说,哪怕static {a=2;}写在static int a=1;前面,编译器已经知道a是这个类的静态变量,只是还没到初始化赋值的步骤。这和局部变量必须先声明再用的规则不一样——类成员变量(包括静态变量)只要在类的某个位置有声明,就能在类的其他静态成员(比如静态代码块)里使用。
疑问2:为什么a的输出是1而不是2?
这要结合Java类加载的两个核心阶段来看:
- 准备阶段:JVM为所有静态变量分配内存,并设置默认初始值(int类型默认是0)。
- 初始化阶段:严格按照代码的书写顺序执行静态代码块和静态变量的赋值语句。
具体到这个例子的执行流程:
- 准备阶段:
a被分配内存,值为0;b被分配内存,值为0。 - 初始化阶段按顺序执行:
- 执行第一个静态代码块:
a=2,此时a的值变为2。 - 执行
static int a=1:把a的值覆盖成1。 - 执行
static int b=3:b的值变为3。 - 执行第二个静态代码块:
b=4,把b的值覆盖成4。
- 执行第一个静态代码块:
- 最后main方法输出时,
a是1,b是4。
内容的提问来源于stack exchange,提问作者bruce66623
相关产品推荐
相关产品推荐

