答案 0 :(得分:2)
在浏览了一些材料并与几个人离线讨论后,我发现了以下信息。
当执行java类时,JVM按顺序执行几个步骤的步骤很少。
在这些阶段中,有一个名为RIWO(只读间接写入)的状态用于静态变量。
在RIWO期间,无法使用其引用直接访问变量。相反,我们需要使用间接方式来调用某些变量。
例如:
class Riwo
{
static int i = 10;
static
{
System.out.println(i);
}
}
在上述情况下,输出为10.
class Riwo {
static int i = 10;
static {
m1();
System.out.println("block1");
}
public static void main(String... args) {
m1();
System.out.println("block main");
}
public static void m1() {
System.out.println(j);
System.out.println("block m1");
}
static int j = 20;
static {
System.out.println("end of code");
}
}
在上述情况下,输出为
0 阻止m1 块1 代码结束 20 阻止m1 阻止主要
class Riwo
{
static
{
System.out.println(i);
System.out.println("block1");
}
static int i = 10;
public static void main(String... args)
{
System.out.println("main block");
}
}
在上面的例子中,我们得到以下编译时错误
Riwo.java:5:非法转发参考 的System.out.println(ⅰ);
这意味着当它处于RIWO状态时我们无法直接读取静态变量。我们应该使用方法间接调用变量。
答案 1 :(得分:0)
静态变量有两种状态
<强>日屋:强> 在将原始值赋给静态变量之前,变量状态称为RIWO状态。
<强> RW:强> 将原始值赋给静态变量后,变量状态称为RW状态。
静态变量有两种类型的读数
直接阅读:
直接从静态块读取静态变量称为直接读取。
InDirect阅读:
通过调用另一个方法从静态块读取静态变量称为间接读取。
直接阅读示例:
注意:当RIWO状态的静态变量时,我们无法执行直接读取。
class DirectReadingExample{
static {
System.out.println("i==="+i);
}
//i is in RIWO state
static int i=100;
//i is in RW State
}
输出: 编译时错误:非法转发参考。
InDirect阅读示例:
注意:当RIWO状态的静态变量时,我们可以执行 InDirect Reading 。
class InDirectReadingExample{
static {
m1();
}
static m1(){
System.out.println("i===="+i);
}
//i is in RIWO state
static int i=100;
//i is in RW State
}
输出: 我=== 0
答案 2 :(得分:0)
如果JVM仅标识了一个变量,而原始值不是 尚未分配,则该变量被称为RIWO
_______________________运行无误__________________________________
class Test{
static int num=10;
static{
System.out.print(num);
System.exit(0);
}
}
在错误范围内运行的________________
class Test{
static{
System.out.print(num);
}
static int num=10;
}
___________________运行无误____________________
class Test{
static{
int x=readVar();
}
static int readVar(){
System.out.print(num);
return 0;
}
static int num=10;
}
num由JVM第一步确定 然后在那时给出默认值 因此num变量的值为0 因为我们无法直接获得价值 但是我们可以间接访问。