看一下下面两个程序的执行结果
class FinalTest1{
public static Final int X = 6/3;
static {
system.out.println("Finaltest1 static block");
}
}
public class Test3 {
public static void main(String[] args) {
system.out.println(FinalTest1.X);
}
}
------------------------------------------------------------------------------------
class FinalTest2{
public static Final int X = new Random.nextInt(100);
static {
system.out.println("Finaltest2 static block");
}
}
public class Test3 {
public static void main(String[] args) {
system.out.println(FinalTest2.X);
}
}
最后的结果是多少?
答案:
2
Finaltest2 static block
58
问:为什么是这个答案有人知道吗?
答:第一个程序,X=6/3,这个计算过程在编译的时候就能计算出来,相当于编译时的一个常量。而第二个是在编译的时候不能得知结果,只能在运行的时候赋值。
第一个程序,编译时的常量不会导致类(FinalTest1)的初始化。第二个程序,需要运行时赋值,就需要初始化这个类。也就会执行这个静态代码块里的语句了。
final 编译时常量和编译时变量会影响类的初始化,从而影响静态代码块的执行。
网友评论