什么是RIWO(读取间接写出)状态
我正在阅读有关静态流量控制的内容,并且遇到了RIWO概念。 有人可以用简单的术语和代码样本来解释这一点吗?
这与错误“非法前向引用”有关。
相关链接 。
在浏览了一些材料并与几个人离线讨论后,我发现了以下信息。
当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 block1代码结束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(i);
这意味着当它处于RIWO状态时我们无法直接读取静态变量。我们应该使用方法间接调用变量。
在为静态变量赋值之前,称为RIWO(Read Indirectly Write Only)状态。
将值赋给静态变量后调用(Read Write)状态。
在RIWO状态下,我们无法直接从静态块中读取变量。 如果您尝试直接读取“非法转发参考”,则会发生错误。
例如:
static int i=10; public static void m1() { System.out.println(i); }
直读:
static { System.out.println(i); //we can read varibles when state is (Read Write) in Direct Reading. }
在直读中:
static{ m1(); }
如果变量刚刚由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标识第1步然后在那时给出默认值,使num变量的值为0,因为我们不能直接获取值但我们可以间接访问。