什么是RIWO(读取间接写出)状态

时间:2015-08-03 04:37:06

标签: java static

我正在阅读关于静态流量控制的内容并且遇到了RIWO概念。有人可以用简单的术语和代码样本来解释这个吗?

这与错误“非法转发参考”有关。

Relevant link

3 个答案:

答案 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(读写)

<强>日屋:      在将原始值赋给静态变量之前,变量状态称为RIWO状态。

<强> RW:      将原始值赋给静态变量后,变量状态称为RW状态。

静态变量有两种类型的读数

  • 直接阅读
  • InDirect阅读

直接阅读:
        直接从静态块读取静态变量称为直接读取。

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 因为我们无法直接获得价值 但是我们可以间接访问。