一个简单地程序示例剖析类加载机制
2017-11-03 21:16
393 查看
实例如下:
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);
}
}
结果:
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加载的过程还是和上面解释的一样,只是因为代码的顺序发生变化结果就不同。
总结:类加载的结果和代码的顺序有关。
相关文章推荐
- 【FreeMarker】【程序开发】一个简单的示例
- 示例 - 17行代码实现一个简单高效的多线程蜘蛛程序
- ReadDirectoryChangesW 监控文件夹 (一个简单的监控示例程序)(文件被修改了,也可以探测到)
- M语言简单示例--加载多个相同格式的文件到一个文件中
- 一个简单的jms聊天室示例程序,pub/sub模型
- qml-------------实现一个简单的图片加载程序
- 【AllJoyn框架-03】官方示例程序basic简单剖析
- 一个简单的MD5加密算法C语言示例程序
- 一个简单的jms点对点示例程序
- C# 创建、部署和调用WebService的简单示例 webservice 可以用于分布式应用程序之间的交互,和不同程序之间的交互。 概念性的东西就不说太多,下面开始创建一个简单的webservi
- 小程序大问题,MSDN中一个小小示例所带来的疑问,一个关于DataList的一个简单应用
- 小程序大问题,MSDN中一个小小示例所带来的疑问,一个关于DataList的一个简单应用
- 一个在程序中实现plugin机制的简单例子
- 第三天 简单的一个程序剖析,关键字,关于变量,常量,标识符,
- 一个系统引导程序的简单示例1
- 一个简单的MD5加密算法C语言示例程序
- 一个系统引导程序的简单示例1
- 【Eclipse RCP】1. 一个简单的RCP程序示例
- Linux Socket 事件触发模型 epoll 示例 这里会写一个用C语言的TCP服务器的完全实现的简单程序
- 一个简单的linux shell程序示例及其说明