類的生命週期

 

類初始化

類"初始化"階段,它是一個類或接口被首次使用的前階段中的最後一項工做,本階段負責爲類變量賦予正確的初始值。java

Java 編譯器把全部的類變量初始化語句和類型的靜態初始化器統統收集到 <clinit> 方法內,該方法只能被 Jvm 調用,專門承擔初始化工做。安全

除接口之外,初始化一個類以前必須保證其直接超類已被初始化,而且該初始化過程是由 Jvm 保證線程安全的。另外,並不是全部的類都會擁有一個 <clinit>() 方法,在如下條件中該類不會擁有 <clinit>() 方法:線程

  • 該類既沒有聲明任何類變量,也沒有靜態初始化語句;
  • 該類聲明瞭類變量,但沒有明確使用類變量初始化語句或靜態初始化語句初始化;
  • 該類僅包含靜態 final 變量的類變量初始化語句,而且類變量初始化語句是編譯時常量表達式。

 

對象實例化

在類被裝載、鏈接和初始化,這個類就隨時均可能使用了。對象實例化和初始化是就是對象生命的起始階段的活動,在這裏咱們主要討論對象的初始化工做的相關特色。對象

Java 編譯器在編譯每一個類時都會爲該類至少生成一個實例初始化方法--即 "<init>()" 方法。此方法與源代碼中的每一個構造方法相對應,若是類沒有明確地聲明任何構造方法,編譯器則爲該類生成一個默認的無參構造方法,這個默認的構造器僅僅調用父類的無參構造器,與此同時也會生成一個與默認構造方法對應的 "<init>()" 方法.blog

一般來講,<init>() 方法內包括的代碼內容大概爲:調用另外一個 <init>() 方法;對實例變量初始化;與其對應的構造方法內的代碼。接口

若是構造方法是明確地從調用同一個類中的另外一個構造方法開始,那它對應的 <init>() 方法體內包括的內容爲:一個對本類的 <init>() 方法的調用;對應用構造方法內的全部字節碼。get

若是構造方法不是經過調用自身類的其它構造方法開始,而且該對象不是 Object 對象,那 <init>() 法內則包括的內容爲:一個對父類 <init>() 方法的調用;對實例變量初始化方法的字節碼;最後是對應構造子的方法體字節碼。編譯器

若是這個類是 Object,那麼它的 <init>() 方法則不包括對父類 <init>() 方法的調用。it

 

摘自https://www.ibm.com/developerworks/cn/java/j-lo-clobj-init/編譯

《解析 Java 類和對象的初始化過程》

相關文章
相關標籤/搜索