首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

非法向前引述

2013-03-17 
非法向前引用来自java 语言规范8.3.2.3:http://docs.oracle.com/javase/specs/jls/se7/html/class Test1 {

非法向前引用
来自java 语言规范8.3.2.3:
http://docs.oracle.com/javase/specs/jls/se7/html/

class Test1 {
    int i = j;  // compile-time error:
                // incorrect forward reference
    int j = 1;
}


class Z {
    static int i = j + 2; 
    static int j = 4;
}

都会报"非法向前引用",我的理解是在变量声明之前使用了它,c语言中这样做是正常的,使用方法和变量之前都要先定义或者声明,习惯了java中方法可以不按顺序随便写(当然变量最好不要乱放位置)就感觉有点奇怪.
java语言规范中有一句不太明白的解释:
The restrictions above are designed to catch, at compile time, circular or otherwise malformed initializations

但是方法却不以这种形式来检查,所以以下代码不会报错,而且执行的结果为0:
class Z {
    static int peek() { return j; }
    static int i = peek();
    static int j = 1;
}
class Test {
    public static void main(String[] args) {
        System.out.println(Z.i);
    }
}

想请教一下,为什么要这样规定,是为了规避什么问题??
[解决办法]
int i = j;
这时候j还没被声明,所以编译异常这个很好理解。
[解决办法]
先声明 后使用
[解决办法]
引用:
引用:

int i = j;
这时候j还没被声明,所以编译异常这个很好理解。


那对于方法为什么没有这样的说法,前边的函数完全可以调用后边的函数,那后边的函数也没声明啊

这个就是编译顺序问题了
调用方法的时候j一定是先被初始化了,但是没有赋值
[解决办法]
我印象中,只有方法和类。可以消除向前引用。

为什么方法和类,可以消除向前引用。确实跟如何编译应该是有关的。

但是,为什么楼主说的那种情况是不行的呢?

其实你可以这么理解。


public class Test {

public static void main(String[] args) throws Exception{
int i = j; //(1)
int j = 10; //(2)
}

}



程序是动态执行的。

运行到(1)的时候,栈里面还没有j

所以int i = j;是错误的。

编译器编译的时候检查出了这种错误。所以不行。
[解决办法]
不能用一个未初始化的值来初始化另一个值吧
[解决办法]
这是个难题  我看我可以mark一下。。
[解决办法]
java中变量,方法,类之间还是有很多区别的。
方法可以,变量不一定可以

热点排行