本帖最后由 苏伯亚 于 2014-4-9 10:57 编辑
非法向前引用 我的理解是在变量声明之前使用了它,c语言中这样做是正常的。但是java中不可以。static都知道是修饰静态变量。
内存总体一共分为了 4个部分(stack segment、heap segment、code segment、data segment) 当我们在程序中,声明一个局部变量的时候,此变量就存放在了 stack segment(栈)当中; 当new 一个对象的时候,此对象放在了heap segment(堆)当中; 而static 的变量或者字符串常量 则存在在 data segment(数据区)中; 那么类中方法的话,是存在在 code segment(代码区)中了。
所以你先
static{
System.out.println(i);
}
这样就先存在数据区。但是前面你并没有声明 i 而是在这个代码后面声明的 i
static int i = 100;
这样 i 的声明就比输出语句晚进入data segment(数据区)中,这样编译的时候自然就会报错。因为编译是从上到下。编译到输出语句时发现现在没有声明 i 而是在后面声明的。所以就报个了非法向前引用异常错误。
至于什么时候报这个异常,就是你这种调用情况吧。变量定义在方法中调用变量之后。才会报这个异常。
希望可以帮到你
|