来自java 语言规范8.3.2.3:
http://docs.oracle.com/javase/specs/jls/se7/html/
- Java code
class Test1 { int i = j; // compile-time error: // incorrect forward reference int j = 1;}
和
- Java code
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:
- Java code
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还没被声明,所以编译异常这个很好理解。
------解决方案--------------------
先声明 后使用
------解决方案--------------------
------解决方案--------------------
我印象中,只有方法和类。可以消除向前引用。
为什么方法和类,可以消除向前引用。确实跟如何编译应该是有关的。
但是,为什么楼主说的那种情况是不行的呢?
其实你可以这么理解。
- Java code
public class Test { public static void main(String[] args) throws Exception{ int i = j; //(1) int j = 10; //(2) } }
------解决方案--------------------
不能用一个未初始化的值来初始化另一个值吧
------解决方案--------------------
这是个难题 我看我可以mark一下。。
------解决方案--------------------
java中变量,方法,类之间还是有很多区别的。
方法可以,变量不一定可以