深入理解java虚拟机系列文章:类的加载、连接与初始化

类开始加载到运行要经过以下几个步骤:

加载:查找并加载类的二进制数据(加载到内存中) 
连接 
    验证:确保被加载的类的正确性 
    准备:为类的静态变量分配内存,并将其初始化为默认值 
    解析:把类中的符号引用转换为直接引用 
初始化:为类的静态变量赋予正确的初始值(用户赋予的值) 

下面看一个例子:

 1 package com.naxsu.jvm;
 2 class Singleton {
 3 //    private static Singleton singleton=new Singleton();//放在前面,输出1和0
 4     public static int count1;
 5     public static int count2 = 0;
 6     private static Singleton singleton=new Singleton();//放在后面,输出1和1
 7 
 8     private Singleton() {
 9         count1++;
10         count2++;
11     }
12     
13     public static Singleton getInstance(){
14         return singleton;
15     }
16 
17 }
18 
19 public class MyTest {
20     public static void main(String[] args) throws ClassNotFoundException {
21         Singleton singleton= Singleton.getInstance();
22         System.out.println(singleton.count1);
23         System.out.println(singleton.count2);
24     }
25 }

我们来分析一下这个类的运行过程:

  1. Singleton类的二进制数据被加载到内存中。
  2. 验证类的正确性
  3. count1count2为配内存,为都赋予默认值0,singleton =null
  4.  

l  放在前面那种情况,singleton =new Singleton(),count1count2都为1,然后给静态变量赋予正确的初始值,这里用户给count2初始化的值是0,所以最后输出是1和0

l  给静态变量赋予正确的初始值,这里用户给count2初始化的值是0,singleton =new Singleton(),count1count2都为1,所以最后输出是1和1

 

 更多资源请访问:http://bbs.naxsu.com

 

posted on 2012-05-13 23:27  那些事儿  阅读(207)  评论(0编辑  收藏  举报