静态常量调用初始化问题

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在编译的时候并不知道具体的数值是多少,需要运行的时候才会被赋值,所以我们可以看出,调用编译时的静态常量并不会初始化这个类(即不属于主动使用),而调用运行时的静态常量是会初始化该类的!

posted on 2013-03-11 10:15  ThinkFar  阅读(442)  评论(0编辑  收藏  举报