一个简单地程序示例剖析类加载机制
来源:互联网 发布:东莞制造业知乎 编辑:程序博客网 时间:2024/06/01 19:00
实例如下:
public class LoadingTest { public static LoadingTest obj=new LoadingTest(); public static int value1; public static int value2=0; public LoadingTest() { value1=10; value2=value1; System.out.println("初始化 value1 之前-->"+value1); System.out.println("初始化 value2 之前-->"+value2); } public static void main(String args[]) { System.out.println("初始化 value1 之后-->"+value1); System.out.println("初始化 value2 之后-->"+value2); }}
结果:初始化 value1 之前-->10初始化 value2 之前-->10初始化 value1 之后-->10初始化 value2 之后-->0
分析:
类的加载流程:加载字节码、验证阶段、准备阶段、解析阶段、初始化阶段* 在准备阶段:jvm会对存放在方法区中的类数据信息的类变量执行初始化* 这里的初始化只是对类中的所有静态变量分配内存空间,并为其设置初始值* 初始化阶段:jvm会将一个类中所有的static关键字标示的代码统统执行一遍* 回到程序,为什么结果是这样呢?* 因为:首先在准备阶段,jvm会按照顺序准备obj、value1、value2* 也就是开辟空间并设置初始值,此时obj=null,value1=value2=0;然后,到了初始化阶段,会一次检查* obj、value1、value2是否需要初始化,obj通过构造方法初始化,* 此时value1、value2的初始值被覆盖为10,然后到value1,用户没有直接赋值* 不用覆盖,最后到了value2,用户赋值0,那么就会覆盖之前的值,因此value2又回到0接下里我们变换代码的顺序:public static int value1; public static int value2=0; public static LoadingTest2 obj=new LoadingTest2();其它不变,执行的结果是:初始化 value1 之前-->10 初始化 value2 之前-->10 初始化 value1 之后-->10 初始化 value2 之后-->10加载的过程还是和上面解释的一样,只是因为代码的顺序发生变化结果就不同。总结:类加载的结果和代码的顺序有关。
阅读全文
0 0
- 一个简单地程序示例剖析类加载机制
- 一个简单地派生程序
- 一个简单地聊天程序
- 一个简单地音乐播放程序
- Eclipse 建立一个简单地JAVA程序
- 简单地一个DOS端口映射程序
- 深入剖析Tomcat类加载机制
- 深入剖析Tomcat类加载机制
- 深入剖析Tomcat类加载机制
- 深入剖析Tomcat类加载机制
- Java类加载机制剖析ClassLoader
- 深入剖析Tomcat类加载机制+图解
- 【AllJoyn框架-03】官方示例程序basic简单剖析
- 【FreeMarker】【程序开发】一个简单的示例
- 一个简单地C语言程序展示RSA加密原理
- 简单地画图程序
- 一个简单地计时器。
- 一个自定义类加载器ClassLoader示例
- 配置单机RocektMq踩过的那些坑
- 2017.11.3总结
- CSS 继承
- 记忆网络之Gated End-To-End Memory Networks
- MySQL explain执行计划解读
- 一个简单地程序示例剖析类加载机制
- 洛谷 3932 浮游大陆的68号岛 前缀和
- bzoj5056: OI游戏
- 手把手教Redis安装
- 刷题#R10
- 阿里云ECS的1M带宽能干嘛?
- 编写服务器和客户端
- 百度前端技术学院-任务四模拟队列
- Windows环境搭建Tomcat+Nginx的负载均衡and动静资源分离