繁星coding
首先,关于执行顺序问题。主要有以下几个要点:变量的声明在任意代码执行前发生(类似于privateStringstr这样的声明并不是可执行代码)接下来是静态块、静态变量的声明时赋值语句,会被合并在一起执行,执行顺序就是它们在代码中的书写顺序接下来是实例块、实例变量的声明时赋值语句、以及构造方法,前两者按照书写顺序执行,构造方法最后执行关于执行顺序,你可以对照你程序的打印输出来看,应该就能明白了。下面再来说说非法向前引用这个错误。前面说过,所有变量的声明都是在任意代码执行前发生的,那么按道理来说并不存在“向前引用”一说,因为任一句代码执行时变量肯定已经存在了才对。那么这个错误究竟是怎么出现的呢?答案是:这是Java编译器强制进行的一个检查其目的是避免循环初始化和其他非正常的初始化行为。所以,虽然你的代码看起来没有问题,但是却无法通过编译器的强制检查,所以报错。那么为什么类似于staticStr="1234";这样的代码可以呢?这是因为Java对其中的某些情况做了“特许”,其中有一条就是“通过简单名称引用的变量可以出现在左值位置,但不能出现在右值的位置”,所以前面的代码可以,但System.out.println(staticStr);不行,因为这是一个右值引用。最后再简单提一下什么是循环引用,看一下下面这个例子:privateinti=j;privateintj=i;如果没有前面说的强制检查,那么这两句代码就会通过编译,但是很容易就能看得出来,i和j并没有被真正赋值,因为两个变量都是未初始化的(Java规定所有变量在使用之前必须被初始化),而这个就是最简单的循环引用的例子。