Java中的前向引用是什么?

Java中的前向引用是什么?,java,Java,我已经看过了,但不清楚Java语言中的转发引用是什么意思。有人能举个例子解释一下吗?简单地说,它意味着引用(访问变量、调用函数)在代码文件的下面 static int x=getY(); static int y=5; static int getY() { return y; } x的值设置为getY()的结果 在y的值设置为5之前调用getY() 因此,x的值为0(默认整数) y的值是5 这是一个编译错误。所有这些都是关于类变量声明的排序。让我们使用一些代码进行说明:

我已经看过了,但不清楚Java语言中的
转发引用是什么意思。有人能举个例子解释一下吗?

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

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

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

      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编译器内置了对此的支持

      但是,不能做的是声明一个依赖于另一个尚未声明的类变量“b”的类变量“a”。依赖类变量声明必须以与其依赖项相反的顺序出现

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


      非法的正向引用包含在JLS的部分中。

      基本上只是编译器读取内容的顺序(如果有)

      int c = 3
      int a = b;
      int b = 5;
      
      编译器将从上到下读取它,因此它将使用第一行,声明变量“c”,并将其分配给3,这很好,然后它将遇到第二行,声明变量“a”,然后尝试将其分配给“b”

      但是现在,编译器有一个问题:这个“b”是什么?它只知道了“c”,最近才知道了“a”,但它不知道任何叫做“b”的东西,因为对于编译器来说,它还没有被声明。因此,既然编译器无法处理所有的混乱,它就会停止,让你去想你做了什么来激怒它

      因此,前向引用部分将是对尚不存在的东西的引用。也许能及时向前

      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*********

      静态变量在实例变量之前加载,因此正向引用静态变量并将其分配给实例变量是完全正确的