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代码不行
------解决方案--------------------
编译器首先分析代码的文本,这一步得先正确,才会再做优化和翻译。它并不会看你代码实际上是什么效果来解决语法错误
------解决方案--------------------
因为{..}和成员变量声明不是同一个级别的,你可以把它看成一个成员函数,只不过调用的时机是构造函数…哦?这已经是运行时的事情了。函数跟其内部引用变量的定义顺序无关
实际上非法前向引用的范围很窄,几乎只有在变量声明的时候才会出现。