本文由 ImportNew - 劉志軍 翻譯自 Javarevisited。歡迎加入翻譯小組。轉載請見文末要求。html
理解類在JVM中何時被加載和初始化是Java編程語言中的基礎概念,正由於有了Java語言規範,咱們才能夠清晰的記錄和解釋這個問題,可是不少Java程序員仍然不知道何時類被加載,何時類被初始化,類加載和初始化好像讓人很困惑,對初學者難以理解,在這篇教程中咱們將看看類加載何時發生,類和接口是如何被初始化的,我並不會拘泥於類加載器的細節或者說類加載器的工做方式。僅僅使這篇文章更加專一和簡結。java
類何時加載程序員
類的加載是經過類加載器(Classloader)完成的,它既能夠是餓漢式[eagerly load](只要有其它類引用了它就加載)加載類,也能夠是懶加載[lazy load](等到類初始化發生的時候才加載)。不過我相信這跟不一樣的JVM實現有關,然而他又是受JLS保證的(當有靜態初始化需求的時候才被加載)。面試
加載完類後,類的初始化就會發生,意味着它會初始化全部類靜態成員,如下狀況一個類被初始化:編程
反射一樣可使類初始化,好比java.lang.reflect包下面的某些方法,JLS嚴格的說明:一個類不會被任何除以上以外的緣由初始化。編程語言
如今咱們知道何時觸發類的初始化了,他精確地寫在Java語言規範中。但瞭解清楚 域(fields,靜態的仍是非靜態的)、塊(block靜態的仍是非靜態的)、不一樣類(子類和超類)和不一樣的接口(子接口,實現類和超接口)的初始化順序也很重要類。事實上不少核心Java面試題和SCJP問題都是基於這些概念,下面是類初始化的一些規則:this
初始化例子spa
這是一個有關類被初始化的例子,你能夠看到哪一個類被初始化翻譯
1code 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
|
從上面結果能夠看出:
再來看一個例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
分析:
還有另一個例子與接口相關的,JLS清晰地解釋子接口的初始化不會觸發父接口的初始化。強烈推薦閱讀JLS14.4理解類加載和初始化細節。以上全部就是有關類被初始化和加載的所有內容。
原文連接: Javarevisited 翻譯: ImportNew.com - 劉志軍
譯文連接: http://www.importnew.com/6579.html
[ 轉載請保留原文出處、譯者和譯文連接。]