日期:2014-05-20  浏览次数:20800 次

关于向前引用的问题

public class Test{
int count = 20 ;
{
count = 12;
}
public Test(){
System.out.println(count);
}
public static void main(String[] args) {
new Test();
}

}

这段代码输出是12;通过javap 可知编译器处理后的类  初始化快没了,count的定义也没有了指定的初始值,
对count的赋值被提取到了构造函数中。就如同下面的代码

public class Test{
    int count;
public Test(){
count = 20;
count = 12;
System.out.println(count);
}
    public static void main(String[] args) {
new Test();
}
}

我的问题是下面的代码为什么不会如同上面一样是等效的

public class Pro{
    int count = age;
    int age = 10;
    {
        count = 12;
    }
    public Pro(){
        System.out.println(count);
    }
    public static void main(String[] args) {
        new Pro();
    }
}


public class Pro{
    int count;
    int age;
    public Pro(){
     count = age;
     age = 10;
     count = 12;
     System.out.println(count);
    }
    public static void main(String[] args) {
     new Pro();
    }
 
}

第一段Pro编译提示向前引用的错误
第二段Pro正常,输出12
之前我还能理解第一段Pro是错的,但是今天看到上面的Test的例子,我又困惑了,
如果说Test那个例子编译器能把第一段Test代码处理后等效于第二段Test代码,
为什么第一段Pro代码不行

------解决方案--------------------
编译器首先分析代码的文本,这一步得先正确,才会再做优化和翻译。它并不会看你代码实际上是什么效果来解决语法错误

------解决方案--------------------
因为{..}和成员变量声明不是同一个级别的,你可以把它看成一个成员函数,只不过调用的时机是构造函数…哦?这已经是运行时的事情了。函数跟其内部引用变量的定义顺序无关
实际上非法前向引用的范围很窄,几乎只有在变量声明的时候才会出现。