類開始加載到運行要經過以下幾個步驟:
加載:查找并加載類的二進制數據(加載到內存中)
連接
驗證:確保被加載的類的正確性
準備:為類的靜態變量分配內存,并將其初始化為默認值
解析:把類中的符號引用轉換為直接引用
初始化:為類的靜態變量賦予正確的初始值(用戶賦予的值)

下面看一個例子:
加載:查找并加載類的二進制數據(加載到內存中)
連接
驗證:確保被加載的類的正確性
準備:為類的靜態變量分配內存,并將其初始化為默認值
解析:把類中的符號引用轉換為直接引用
初始化:為類的靜態變量賦予正確的初始值(用戶賦予的值)

下面看一個例子:
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 }
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. 為count1,count2為配內存,為都賦予默認值0,singleton =null
4.
l 放在前面那種情況,singleton =new Singleton(),count1和count2都為1,然后給靜態變量賦予正確的初始值,這里用戶給count2初始化的值是0,所以最后輸出是1和0
l 給靜態變量賦予正確的初始值,這里用戶給count2初始化的值是0,singleton =new Singleton(),count1和count2都為1,所以最后輸出是1和1
更多資源請訪問:http://bbs.naxsu.com