Java中的前向引用是什么?
我已经看过了,但不清楚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 这是一个编译错误。所有这些都是关于类变量声明的排序。让我们使用一些代码进行说明:
转发引用是什么意思。有人能举个例子解释一下吗?简单地说,它意味着引用(访问变量、调用函数)在代码文件的下面
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*********
静态变量在实例变量之前加载,因此正向引用静态变量并将其分配给实例变量是完全正确的