類的整個生命週期:
驗證,準備,解析又統稱連線。
載入,驗證,準備,初始化,解除安裝這5個階段總是按順序「開始」(而不是順序進行或者完成)
有且只有5種情況必須立即對類進行初始化
除了這5個場景,其他引用類的方式都不會觸發其初始化。如
在準備階段,變數被賦初始值
() 方法是由編譯器自動收集類中的所有類變數的賦值動作和static{}塊中的語句合併產生的,按原始檔**順序收集。
static{}塊中只能訪問定義在其之前的變數,定義在其後的變數可以賦值,但不能訪問。
()方法由虛擬機器保證其父類的()方法已經執行完畢。
()方法由虛擬機器保全其在多執行緒的情況下被正確的加鎖,同步,只有乙個執行緒會去執行初始化操作,其他的執行緒處於阻塞狀態。
public
class deadloopclass }}
}public
class testdeadloopclass
};thread t1 = new thread(script1);
thread t2 = new thread(script1);
t1.start();
t2.start();
}}
thread[thread-1,5,main]start
thread[thread-0,5,main]start
thread[thread-1,5,main]looping
thread[thread-1,5,main]looping
thread[thread-1,5,main]looping
靜態內部類載入時機
這兩天在學習設計模式,其中單例模式有種實現是通過靜態內部類方式實現,有些不可思議,故在此做個小實驗驗證一下靜態內部類的載入時機 public class teststatic public teststatic 內部類 class innerclass 靜態內部類 static class stat...
關於類名呼叫類中的常量時類的載入時機
源 如下 class father public void init static static class son extends father public class test 執行結果如下 讓我們來分析下流程 當主函式中 system.out.println father.f 這行 執行時,...
類初始化時機
虛擬機器規範中並沒有強制約束何時進行載入,但是規範嚴格規定了有且只有下列五種情況必須對類進行初始化 載入 驗證 準備都會隨之發生 以上 5 種場景中的行為稱為對乙個類進行主動引用。除此之外,所有引用類的方式都不會觸發初始化,稱為被動引用。被動引用的常見例子包括 system.out.println ...