我正在阅读有关 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
}
}
b
是仅在方法作用域中定义的变量,因此编译器可以知道之前没有人初始化过它,但a
是一个公共变量,可能会在其他地方初始化。
a
是原始类型 int
,它将立即初始化,这意味着:
静态类成员:在类加载时获得初始化(大多数时候,在之前
main()
,但这取决于类加载的时间)。
class S {
static int a;
}
非静态类成员:当对象存在时被初始化。 (大多数时候在
new
之后,但还有其他更高级的方法来新建对象)。
class S {
int a;
}
局部变量:应在首次使用之前在方法的范围内初始化。
class S {
void foo() {
int b = 0;
}
}
已更正后编辑...