在Java中所谓的前向引用?

关于前向引用的合法性,我一直在讨论这个问题,但不清楚Java语言中forward references含义。 有人可以借助一个例子来解释一下吗?

这特别是编译错误。 它的全部都是关于类变量声明的排序。 让我们使用一些代码用于说明目的:

 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 第8.3.2.3节涵盖了非法的前向引用。

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

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

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

但是现在,编译器有一个问题:这个’b’是什么东西? 它还只学习了’c’,最近才知道’a’,但是它没有任何知识称为’b’,因为对于编译器来说,它还没有被声明。 那么,既然编译器无法处理所有的混淆,它就会停止,并让你知道你做了什么来激怒它。

因此,前向引用部分将是对尚不存在的内容的引用。 及时转发..

简单来说,它意味着在代码文件中进一步向下引用(访问变量,调用函数)。

  static int x=getY(); static int y=5; static int getY() { return y; } 
  • x的值设置为getY()的结果
  • 在y的值设置为5之前调用getY()
  • 因此x的值为0(默认整数)
  • y的值是5
 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 *********

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