zoukankan      html  css  js  c++  java
  • 静态常量调用初始化问题

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

  • 相关阅读:
    依赖注入
    微服务下的安全方案
    VS2019 社区版(community) 离线版本 解决“试用30天过期”步骤
    webpack4升级webpack5
    Ubuntu 上 Node.js 安装和卸载
    记录一次使用locust压测的过程
    大厂面试通关指南,已拿腾讯,阿里offer(附100+最新大厂真题)
    通过自己整理和刷题三个月成功入职腾讯,皇天不负有心人啊!!
    不懂就问系列,为什么别人能靠这份面试题宝典去大厂?(内附面试题答案)
    整理了3家面试问题:美团+字节+腾讯,个个三面,你认为你能走到哪一面?
  • 原文地址:https://www.cnblogs.com/hzcxy/p/2953508.html
Copyright © 2011-2022 走看看