【问题标题】:What is called a forward reference in Java?Java中的前向引用是什么?
【发布时间】:2013-01-24 19:46:42
【问题描述】:

我经历过this question on legality of forward references ,但不清楚forward references 在Java 语言中的含义。有人可以在示例的帮助下解释一下吗?

【问题讨论】:

    标签: java


    【解决方案1】:

    这是一个编译错误。这一切都与类变量声明的顺序有关。让我们使用一些代码进行说明:

    public class ForwardReference {        
       public ForwardReference() {
          super();
       }
    
       public ForwardReference echoReference() {
          return this;
       }
    
       public void testLegalForwardReference() {
          // Illustration: Legal
          this.x = 5;
       }
    
       private int x = 0;
    
       // Illustration: Illegal
       private ForwardReference b = a.reference();
       private ForwardReference a = new ForwardReference();
    }
    

    如您所见,Java 允许您在 类方法 中引用 类变量,即使该变量的声明在之后 方法。这是(合法)前向引用的示例,Java 编译器中内置了对此的支持。

    不能做的是声明一个类变量'a',它依赖于另一个尚未声明的类变量'b'。依赖类变量声明必须以它们依赖的相反顺序出现。

    切线,如果您的代码包含非法引用错误,大多数(如果不是所有)IDE 都会警告您。

    JLS 的section 8.3.2.3 涵盖了非法前向引用。

    【讨论】:

      【解决方案2】:

      这基本上只是编译器读取内容的顺序,如果你有的话

      int c = 3
      int a = b;
      int b = 5;
      

      编译器会从上到下读取它,所以它会选择第一行,它声明了一个变量'c',并将它分配给3,这很好,然后它会遇到第二行,它声明变量“a”,然后尝试将其分配给“b”。

      但是现在,编译器有一个问题:这个'b'是什么东西?它才知道'c',最近才知道'a',但它不知道任何叫做'b'的东西,因为对于编译器来说,它还没有被声明。那么,由于编译器无法处理所有的混乱,它会停下来,让你弄清楚你做了什么来激怒它。

      因此,前向引用部分将是对尚不存在的事物的引用。或许及时向前。。

      【讨论】:

        【解决方案3】:

        简单来说,它意味着引用(访问变量、调用函数)在代码文件的更下方。

           static int x=getY();
           static int y=5;
           static int getY() { return y; }
        
        • x的值设置为getY()的结果
        • getY() 在 y 的值设置为 5 之前调用
        • 因此x的值为0(默认整数)
        • y 的值为 5

        【讨论】:

          【解决方案4】:
          public class AnyCode {
          
              void print() {
                  System.out.println("Value of j - " + j);   // legal
                  System.out.println("Value of i  - " + i);  // legal
              }
          
              // CASE - 1 
              int k = i;         // illegal
              int i; 
          
              // CASE - 2 
              int l = j;         // legal
              static int m = j;  // illegal
              static int j;
          
              // CASE - 3 
              A aObj = bObj;     // illegal
              B bObj = new B();
          
              public static void main(String[] args) {
          
                  /* 
                     Note :- here anyCode act as a local variable and get space on stack 
                     whereas the object it is referring to is present on heap. And you 
                     cannot forward reference a local variable. 
                  */
          
                  anyCode.print();    // 'Cannot find symbol' error
                  AnyCode anyCode = new AnyCode();
              }
          
          }
          
          class A {
          
          }
          
          class B {
          
          }
          

          *********参考案例 - 1************

          不允许前向引用实例变量,因为编译器不确定我们前向引用的值的类型,或者甚至可能不存在这样的变量。

          考虑一个例子:-

          int a = b;
          boolean b = false;
          

          如果在上述情况下允许前向引用,那么它可能会造成严重破坏。

          int a = b; // What is b? is it a primitive variable or a value or a object reference
          

          在上面的例子中,我决定不声明 b,现在如果 java 允许这样的赋值,那么这将是一场噩梦。

          **********参考案例 - 2**********

          静态变量在实例变量之前加载,因此前向引用静态变量并将它们分配给实例变量非常好

          【讨论】:

            猜你喜欢
            • 2010-09-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-01-26
            • 1970-01-01
            • 2016-01-17
            • 2011-06-13
            相关资源
            最近更新 更多