静态常量调用初始化问题

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

转载于:https://www.cnblogs.com/hzcxy/archive/2013/03/11/2953508.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值