You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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类加载的两个核心阶段来看:

  1. 准备阶段:JVM为所有静态变量分配内存,并设置默认初始值(int类型默认是0)。
  2. 初始化阶段:严格按照代码的书写顺序执行静态代码块和静态变量的赋值语句。

具体到这个例子的执行流程:

  • 准备阶段:a被分配内存,值为0;b被分配内存,值为0。
  • 初始化阶段按顺序执行:
    1. 执行第一个静态代码块:a=2,此时a的值变为2。
    2. 执行static int a=1:把a的值覆盖成1。
    3. 执行static int b=3:b的值变为3。
    4. 执行第二个静态代码块:b=4,把b的值覆盖成4。
  • 最后main方法输出时,a是1,b是4。

内容的提问来源于stack exchange,提问作者bruce66623

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 14:30:12