• 静态常量调用初始化问题


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

  • 相关阅读:
    测试常用的sql语句总结
    测试常用的Linux命令总结
    【转载】vim 中如何替换选中行或指定几行内的文本
    1074 Reversing Linked List
    1077 Kuchiguse
    LC 355. Design Twitter
    LCP 5. 发 LeetCoin
    LC 1409. Queries on a Permutation With Key
    1095 Cars on Campus
    LC 1369. Get the Second Most Recent Activity
  • 原文地址:https://www.cnblogs.com/hzcxy/p/2953508.html
Copyright © 2020-2023  润新知