为什么指定行上方的行没有编译错误?

Tyl*_*ton 3 java compiler-construction variables scope

我正在阅读Java,我正在摸索为什么System.out.println("a: " + a);不会产生编译错误.在哪里a初始化?

public class localVariableEx {
    public static int a;
    public static void main(String[] args) {
        int b;
        System.out.println("a: " + a);
        System.out.println("b: " + b);  //Compilation error
    }
}
Run Code Online (Sandbox Code Playgroud)

Joa*_*uer 9

相关的规则在JLS§4.12.5变量的初始值(强调我的)中描述:

  • 每个类变量,实例变量数组组件在创建时都会使用默认值进行初始化(§15.9,§15.10):[...]
  • [...]
  • 一个局部变量(§14.4,§14.14)必须明确给出的数值在使用之前,由要么初始化(§14.4)或分配(§15.26),因为可以通过使用一定的规则编译器验证的方式任务(§16).

因此,虽然实例变量(例如a)会自动获取默认值,但局部变量(例如b)不会获得一个,除非编译器可以验证是否已为其分配了值,否则不得使用它.


MBy*_*ByD 8

b是仅在方法范围中定义的变量,因此编译器可以知道之前没有人初始化它,但是a可以在其他地方初始化的公共变量.