我看过关于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编译器支持该功能。
但您不能声明一个依赖于另一个未声明的类变量'b'的类变量'a'。具有依赖关系的类变量声明必须按其依赖关系的相反顺序出现。
另外,大多数(如果不是全部)集成开发环境都会警告您的代码是否包含非法引用错误。
非法前向引用的详细内容请参见JLS的第8.3.2.3节。
基本上是编译器读取顺序的问题,如果你有
int c = 3
int a = b;
int b = 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
static int x=getY();
static int y=5;
static int getY() { return y; }