package com.yhj.jvm.classloader.finalTest; import java.util.Random; /** * @Description:静态成员测试 * @Author YHJ create at 2011-6-26 下午02:54:23 * @FileName com.yhj.jvm.classloader.finalTest.$StaticClassTest.java */ class StaticClassTest{ public static int staticValue = 2 / 1; static{ System.out.println("StaticClassTest's static block!"); } } //=================================================================== /** * @Description:Final成员测试1 * @Author YHJ create at 2011-6-26 下午02:56:36 * @FileName com.yhj.jvm.classloader.finalTest.$StaticFinalTest1.java */ class StaticFinalTest1{ public final static int staticValue = 2 / 1; static{ System.out.println("StaticFinalTest1's static block!"); } } //=================================================================== /** * @Description:Final成员测试2 * @Author YHJ create at 2011-6-26 下午02:56:46 * @FileName com.yhj.jvm.classloader.finalTest.TestCase.$StaticFinalTest2.java */ class StaticFinalTest2{ public final static int staticValue = new Random().nextInt(10); static{ System.out.println("StaticFinalTest2's static block!"); } } //=================================================================== /** * @Description: 测试用例:用于测试 * @Author YHJ create at 2011-6-26 下午02:52:58 * @FileName com.yhj.jvm.classloader.finalTest.TestCase.java */ public class TestCase { public static void main(String[] args) { System.out.println(StaticClassTest.staticValue); System.out.println(StaticFinalTest1.staticValue); System.out.println(StaticFinalTest2.staticValue); } }
第一个静态变量调用我们已经知道了,会执行静态代码块,那第二个和第三个呢?他们的区别是第二个是在第一个的基础之上将staticValue变为了final,第三个对于第二个的区别是第三个static不是一个计算的具体值,而是0-10之间的一个随机数!又有什么样的区别呢?我们先来看一下运行结果!
从运行结果我们看出,StaticFinalTest1的静态代码块没有执行,即StaticFinalTest1类并没有被初始化,而StaticFinalTest2被初始化了!
这是为什么呢?我们再来看一下他们的区别:StaticFinalTest1的静态常量值是2/1=2,对于这种值在编译的时候JVM就会把结果计算出来放进class文件中,相当于StaticFinalTest1=2,而StaticFinalTest2在编译的时候并不知道具体的数值是多少,需要运行的时候才会被赋值,所以我们可以看出,调用编译时的静态常量并不会初始化这个类(即不属于主动使用),而调用运行时的静态常量是会初始化该类的!