在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 *********
静态变量在实例变量之前加载,因此转发引用静态变量并将它们分配给实例变量是完全正确的