Java的对象初始化过程
成員變量(字段)初始化順序
在一個(gè)類里初始化的順序是由成員變量在類里面的定義的順序來(lái)決定的。即使成員變量大量散布于類的各個(gè)方法定義的中間,那些成員變量仍會(huì)在調(diào)用任何方法之前得以初始化,甚至在構(gòu)造函數(shù)調(diào)用之前。
若數(shù)據(jù)是靜態(tài)的(static),那么同樣的事情就會(huì)發(fā)生;如果它屬于一個(gè)基本類型(主類型),而且未對(duì)其初始化,就會(huì)自動(dòng)獲得自己的標(biāo)準(zhǔn)基本類型初始值;如果它是指向一個(gè)對(duì)象的句柄,那么除非新建一個(gè)對(duì)象,并將句柄同它連接起來(lái),否則就會(huì)得到一個(gè)空值(NULL)。
static 初始化只有在必要的時(shí)候才會(huì)進(jìn)行。如果不創(chuàng)建一個(gè)Table 對(duì)象,而且永遠(yuǎn)都不引用Table.b1 或Table.b2,那么static Bowl b1 和b2 永遠(yuǎn)都不會(huì)創(chuàng)建
?
對(duì)象創(chuàng)建過(guò)程
找到Dog.class 后(它會(huì)創(chuàng)建一個(gè)Class 對(duì)象),它的所有static 初始化模塊都會(huì)運(yùn)行。因此,static 初始化僅發(fā)生一次——在Class 對(duì)象首次載入的時(shí)候;
創(chuàng)建一個(gè)new Dog()時(shí),Dog 對(duì)象的構(gòu)建進(jìn)程首先會(huì)在內(nèi)存堆(Heap)里為一個(gè)Dog 對(duì)象分配足夠多的存儲(chǔ)空間;
這種存儲(chǔ)空間會(huì)清為零,將Dog 中的所有基本類型(Primitive)設(shè)為它們的默認(rèn)值(0用于數(shù)字,以及boolean 和char 的等價(jià)設(shè)定);
進(jìn)行成員字段定義時(shí)發(fā)生的所有初始化都會(huì)執(zhí)行;
執(zhí)行構(gòu)造函數(shù)。
?
?static構(gòu)建從句
class Spoon {static int i;static {i = 47;}// . . .盡管看起來(lái)象個(gè)方法,但它實(shí)際只是一個(gè)static關(guān)鍵字,后面跟隨一個(gè)方法主體。與其他static初始化一樣,這段代碼僅執(zhí)行一次——首次生成那個(gè)類的一個(gè)對(duì)象時(shí),或者首次訪問(wèn)屬于那個(gè)類的一個(gè)static 成員時(shí)(即便從未生成過(guò)那個(gè)類的對(duì)象)
總結(jié)
以上是生活随笔為你收集整理的Java的对象初始化过程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 全文检索引擎Solr系列——Solr核心
- 下一篇: go git 安装配置与使用 (wind