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

求详细的解释
public class a {
static{
System.out.println("a");
}
static int a = 1;
}
public class b {
public static void main(String[] args) {
System.out.print(a.a);
}
}
会输出a 1
如果改成static final int a =1;
只输出1
这是为什么啊?

------解决方案--------------------
static final int a =1;此时定义的a是编译时常量
此时的System.out.print(a.a);
编译之后就变成:System.out.print(1);
因此,不会导致类的初始化。

------解决方案--------------------
不加final,就构建了类b的新对象。先运行static块内的代码,再给a赋值。

加了final,a就是一个静态常量,直接被输出了。就像Math.PI一样。
------解决方案--------------------
final的变量被替换了,变成了常数。

所以,定义public的final一定要慎重,一点变动,所有相关的类都要重新编译,否则后果很奇怪的。