类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载七个阶段。
类初始化是类加载过程的最后一个阶段,到初始化阶段,才真正开始执行类中的Java程序代码。虚拟机规范严格规定了有且只有5种情况必须立即对类进行初始化:

第一种:遇到new、getstatic、putstatic、invokestatic这四条字节码指令时,如果类还没有进行过初始化,则需要先触发其初始化。生成这四条指令最常见的Java代码场景是:使用new关键字实例化对象时、读取或设置一个类的静态字段(static)时(被static修饰又被final修饰的,已在编译期把结果放入常量池的静态字段除外)、以及调用一个类的静态方法时。
第二种:使用Java.lang.refect包的方法对类进行反射调用时,如果类还没有进行过初始化,则需要先触发其初始化。
第三种:当初始化一个类的时候,如果发现其父类还没有进行初始化,则需要先触发其父类的初始化。
第四种:当虚拟机启动时,用户需要指定一个要执行的主类,虚拟机会先执行该主类。
第五种:当使用JDK1.5支持时,如果一个java.langl.incoke.MethodHandle实例最后的解析结果REF_getStatic、REF_putStatic、REF_invokeStatic的方法句柄,并且这个方法句柄所对应的类没有进行过初始化,则需要先触发其初始

执行代码:

package com.spring.partise;import java.util.Random;class A{static final int numA = Main.rand.nextInt(100);static{System.out.println("I am A");}
}
class B{static final int numB = 2;static{System.out.println("I am B");}
}
class C{static int numC = 3;static{System.out.println("I am C");}
}
public class Main {static Random rand = new Random();public static void main(String[] args) throws Exception {System.out.println("---------------------------");System.out.println(A.numA);//会执行static中的方法System.out.println("---------------------------");System.out.println(B.numB);//不会执行static中的方法System.out.println("---------------------------");System.out.println(C.numC);}
}

执行结果:

---------------------------
I am A
22
---------------------------
2
---------------------------
I am C
3

总结:如果一个static final值是“编译期常量”,就像static final int numB = 2;那样,那么这个值不需要对B类进行初始化就可以读取。但是,如果只是将一个域设置为static和final的,那不一足以确保这种行为,例如,对static final int numA = Main.rand.nextInt(100);的访问将强制进行类的初始化,因为它不是一个编译期常量。
如果一个static 域不是final,那么在对它访问时,总是要求在它被读取之前,要先进行链接(为这个域分配存储空间)和初始化(初始化该存储空间)就像static int numC = 3;那样!!!

java调用类中的静态变量时类中静态代码块什么情况会执行以及类的初始化问题?相关推荐

  1. java静态代码块和静态变量_Java中的静态变量、静态方法与静态代码块

    我们知道类的生命周期分为装载.连接.初始化.使用和卸载的五个过程. 其中静态代码在类的初始化阶段被初始化.而非静态代码则在类的使用阶段(也就是实例化一个类的时候)才会被初始化. 静态变量 可以将静态变 ...

  2. c语言静态函数调用静态变量_C语言中的静态变量和函数

    c语言静态函数调用静态变量 C中的静态变量 (Static Variables in C) Basically, when static variables are declared, they cr ...

  3. static的三种用法,定义静态变量,静态函数,静态代码块!

    static的三种用法,定义静态变量,静态函数,静态代码块! 1.定义静态变量 class PersonStatic { //静态变量的特点 //1.静态变量无需生成对象就可被调用,可以使用类名和对象 ...

  4. [html] 当html中使用map标签时,area中coords值如何精确定位呢?

    [html] 当html中使用map标签时,area中coords值如何精确定位呢? 在 area 标签上支持的属性有 shape.coords.href.alt.target.type.downlo ...

  5. Java常见面试知识点:继承、接口、多态、代码块

    问题:Java常见面试知识点:继承.接口.多态.代码块 答案: 1.继承 继承中构造方法的访问特点 子类中所有的构造方法默认都会访问父类中无参的构造方法 为什么? • 子类在初始化的时候,有可能会使用 ...

  6. Day10 (代码块,继承,Math,类Test,面试题)

    一.代码块: 在Java中,使用{}括起来的代码成为代码块,根据其位置和声明的不同,可以分为局部代码块,构造代码块,静态代码块,同步代码块(多线程讲解) 局部代码块: 在方法中出现,限定变量的生命周期 ...

  7. 构造代码块、静态代码块、构造方法的执行顺序

    构造代码块.静态代码块.构造方法的执行顺序 牛客网上的一道题目: 通过查询,我写的这道题的解题步骤: package niukewang;/*** @author jxd* @date 2021/8/ ...

  8. 静态代码块与静态函数的执行顺序

    class Person {         Person()         {                 System.out.println("-----------构造函数-- ...

  9. 静态代码块、非静态代码块、构造函数三者执行顺序

    主要探讨一下关于静态代码块,非静态代码块,构造函数的执行顺序. 如有错误,欢迎指出. 首先: 静态成员变量和静态代码块的优先级是一样的,先定义的先执行. 在创建一个对象的时候会执行非静态代码块和构造函 ...

最新文章

  1. php编程神器,PHP代码神器 十个PHP代码片段超极好用
  2. Java基类共同属性设置_java – 你有一个Hibernate实体的基类吗?
  3. 复习之 c实现 通讯录
  4. android apr分析,APR分析信号篇
  5. 最新互助盘模式_【爆料】“鸿运之都”抢单互助资金盘是“侏罗纪世界”的重启盘,操盘手疯狂抽水几百万马上崩盘!...
  6. python__实参前加*和**的(拆包)功能
  7. ab压力测试php脚本,ab压力测试工具-批量压测脚本
  8. Linux-3.2.0.24中内核的Netlink测试使用
  9. WebRequestDataBinder实现将请求参数映射为POJO对象
  10. Android学习之为按钮添加事件监听器的两种方法
  11. [再学Python] - 3 - 异常处理 try…except…
  12. Software - ASCII码表
  13. 阿里资深架构师总结:顶级高手都具备的四种思维模型
  14. 提交代码遇到的问题remote: Support for password authentication was removed on August 13, 2021.
  15. “甲骨文”的传奇故事
  16. 硬盘知识:硬盘中蓝盘、绿盘、黑盘、红盘有什么区别?
  17. 支付宝微信刷脸支付开始在全国推广
  18. C语言学习笔记第五天_项目训练
  19. 【深入理解TcaplusDB技术】入门Tcaplus SQL Driver
  20. 接口自动化测试项目实战

热门文章

  1. java或异运算_java中与运算,或运算,异或运算,取反运算
  2. java 线程状态_面试官问:为什么Java线程没有Running状态?我懵了
  3. malloc 结构体_二进制安全之堆溢出(系列)——堆基础 amp; 结构(二)
  4. 数据结构实验之图论九:最小生成树_初高中数学竞赛训练----图论初步2
  5. python代码自动生成器下载_Python代码生成器
  6. 服务器搭建php mysql5_Windows下php5+apache+mysql5 手工搭建笔记
  7. python 网络摄像头安装图解_网络摄像头在opencv-python和opencv-contrib-python...
  8. 【Effective Java】第二章:静态工厂、构建器、强化Singleton属性、私有构造器、
  9. 301.inc.php,DeDeCMS默认首页及WWW域的301跳转
  10. jlabel 不能连续两次set_为什么有时连续多次setState只有一次生效?