Unt*_*led 10 java block initializer
我有理解初始化发生顺序的问题.这是我假设的顺序:
*Once per
1. Static variable declaration
2. Static block
*Once per object
3. variable declaration
4. initialization block
5. constructor
Run Code Online (Sandbox Code Playgroud)
但根据这段代码,我显然是错的:
class SomethingWrongWithMe
{
{
b=0; //no. no error here.
int a = b; //Error: Cannot reference a field before it is defined.
}
int b = 0;
}
Run Code Online (Sandbox Code Playgroud)
如果我这样做,错误就会消失:
class SomethingWrongWithMe
{
int b = 0;
{
b=0;
int a = b; //The error is gone.
}
}
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚为什么没有错误
b=0;
Run Code Online (Sandbox Code Playgroud)
Java 语言规范(第 8.3.2.3 节)规定,您可以在表达式的左侧使用变量,即在声明变量之前对其进行赋值,但不能在右侧使用它。
所有变量都初始化为其默认值,然后显式初始化程序和匿名块按照在源文件中找到的顺序运行。最后调用构造函数。
静态仅在第一次使用类时运行一次。
编译错误似乎是 Java 的一条规则,而不是在每种情况下都必然有意义的东西。