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

时间:2011-04-10 07:19:10

标签: java variables compiler-construction 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
    }
}

3 个答案:

答案 0 :(得分:9)

the JLS § 4.12.5 Initial Values of Variables(强调我的)中描述了相关的相关规则:

  
      
  • 每个类变量实例变量数组组件在创建时都会使用默认值进行初始化(§15.9§15.10):[...]
  •   
  • [...]
  •   
  • 本地变量§14.4§14.14必须在使用之前通过初始化({{}显式赋予值 3}})或赋值(§14.4),可以由编译器使用明确赋值规则(§15.26)进行验证。
  •   

因此,当实例变量(例如a)自动获得默认值时,局部变量(例如b)不会获得一个,除非编译器可以验证值已分配给他们。

答案 1 :(得分:8)

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

答案 2 :(得分:0)

a属于原始类型int,会立即初始化,这意味着:

静态类成员:在加载类时获取初始化(大部分时间,在main()之前,但它取决于何时加载类)。< / p>

class S {
  static int a;
}

非静态类成员:在对象出现时进行初始化。 (大部分时间在new之后,但还有其他更高级的方法来创建新对象。)

class S {
  int a;
}

本地变量:应该在首次使用之前在方法的范围内初始化。

class S {
  void foo() {
    int b = 0;
  }
}

经过更正后编辑...