什么是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,因为我们不能直接获取值但我们可以间接访问。