类开始加载到运行要经过以下几个步骤:
加载:查找并加载类的二进制数据(加载到内存中)
连接
验证:确保被加载的类的正确性
准备:为类的静态变量分配内存,并将其初始化为默认值
解析:把类中的符号引用转换为直接引用
初始化:为类的静态变量赋予正确的初始值(用户赋予的值)
[img]http://dl.iteye.com/upload/attachment/0068/0500/cfa96257-d6b8-384a-be40-2f6fa85fd02c.jpg[/img]
下面看一个例子:
我们来分析一下这个类的运行过程:
1. Singleton类的二进制数据被加载到内存中。
2. 验证类的正确性
3. 为count1,count2为配内存,为都赋予默认值0,singleton =null
4.
放在前面那种情况,singleton =new Singleton(),count1和count2都为1,然后给静态变量赋予正确的初始值,这里用户给count2初始化的值是0,所以最后输出是1和0
给静态变量赋予正确的初始值,这里用户给count2初始化的值是0,singleton =new Singleton(),count1和count2都为1,所以最后输出是1和1
转载请注明出处:[url=http://bbs.naxsu.com/forum.php?mod=viewthread&tid=24]http://bbs.naxsu.com/forum.php?mod=viewthread&tid=24[/url]
加载:查找并加载类的二进制数据(加载到内存中)
连接
验证:确保被加载的类的正确性
准备:为类的静态变量分配内存,并将其初始化为默认值
解析:把类中的符号引用转换为直接引用
初始化:为类的静态变量赋予正确的初始值(用户赋予的值)
[img]http://dl.iteye.com/upload/attachment/0068/0500/cfa96257-d6b8-384a-be40-2f6fa85fd02c.jpg[/img]
下面看一个例子:
package com.naxsu.jvm;
class Singleton {
// private static Singleton singleton=new Singleton();//放在前面,输出1和0
public static int count1;
public static int count2 = 0;
private static Singleton singleton=new Singleton();//放在后面,输出1和1
private Singleton() {
count1++;
count2++;
}
public static Singleton getInstance(){
return singleton;
}
}
public class MyTest {
public static void main(String[] args) throws ClassNotFoundException {
Singleton singleton= Singleton.getInstance();
System.out.println(singleton.count1);
System.out.println(singleton.count2);
}
}
我们来分析一下这个类的运行过程:
1. Singleton类的二进制数据被加载到内存中。
2. 验证类的正确性
3. 为count1,count2为配内存,为都赋予默认值0,singleton =null
4.
放在前面那种情况,singleton =new Singleton(),count1和count2都为1,然后给静态变量赋予正确的初始值,这里用户给count2初始化的值是0,所以最后输出是1和0
给静态变量赋予正确的初始值,这里用户给count2初始化的值是0,singleton =new Singleton(),count1和count2都为1,所以最后输出是1和1
转载请注明出处:[url=http://bbs.naxsu.com/forum.php?mod=viewthread&tid=24]http://bbs.naxsu.com/forum.php?mod=viewthread&tid=24[/url]
本文详细介绍了Java虚拟机(JVM)中类从加载到运行的全过程,包括加载、验证、准备、解析和初始化等阶段,并通过具体示例说明了静态变量的内存分配及初始化过程。
4420

被折叠的 条评论
为什么被折叠?



