class revi {
static {
i = 3;
System.out.println("Hello World!");
}
static int i = 15;
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
Run Code Online (Sandbox Code Playgroud)
以上程序不会给出任何错误i=3; 但是当我们调用静态块的iin println()方法时,它会显示错误
revi.java:6:错误:非法转发引用System.out.println("Hello World!"+ i); ^ 1错误
class revi {
static {
i = 3;
System.out.println("Hello World!" + i);
}
static int i = 15;
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
Run Code Online (Sandbox Code Playgroud)
但如果像这样修改上面的程序它工作(静态变量首次加载)println方法没有错误
class revi {
static int i = 15;
static {
i = 3;
System.out.println("Hello World!" + i);
}
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
Run Code Online (Sandbox Code Playgroud)
请解释内部流程......
这在JLS的8.3.3节中有所介绍:
使用声明在使用后以文本形式出现的类变量有时会受到限制,即使这些类变量在范围内(第6.3节).具体来说,如果满足以下所有条件,则为编译时错误:
在使用类变量之后,类或接口C中的类变量声明以文本形式出现;
在C的类变量初始化程序或C的静态初始化程序中使用是一个简单的名称;
使用不在作业的左侧;
C是封闭使用的最内层类或接口.
在您的情况下,当您打印值时,所有这些都是正确的,因此错误.
更改代码以移动声明后,第一个项目符号不再成立,因此编译.