2 回答

TA貢獻(xiàn)1966條經(jīng)驗(yàn) 獲得超4個(gè)贊
類初始化
對(duì)常量變量(§4.12.4)的字段的引用必須在編譯時(shí)解析為由常量變量的初始化器表示的值V。
如果這樣的字段是靜態(tài)的,那么在二進(jìn)制文件中的代碼中不應(yīng)該存在對(duì)該字段的引用,包括聲明該字段的類或接口。這樣的字段必須始終看起來已經(jīng)初始化(§12.4.2);字段的缺省初始值(如果與V不同)絕不能被觀察到。
如果這樣的字段是非靜態(tài)的,那么除了包含字段的類之外,二進(jìn)制文件中的代碼中不應(yīng)該存在對(duì)字段的引用。(它將是一個(gè)類,而不是一個(gè)接口,因?yàn)榻涌谥挥徐o態(tài)字段。)類應(yīng)該有代碼,以便在實(shí)例創(chuàng)建期間將字段的值設(shè)置為V(§12.5)。
對(duì)象初始化
將構(gòu)造函數(shù)的參數(shù)分配給此構(gòu)造函數(shù)調(diào)用的新創(chuàng)建的參數(shù)變量。
如果該構(gòu)造函數(shù)以同一個(gè)類中的另一個(gè)構(gòu)造函數(shù)的顯式構(gòu)造函數(shù)調(diào)用(§8.8.7.1)開始(使用此方法),則使用這五個(gè)步驟遞歸地計(jì)算參數(shù)和處理構(gòu)造函數(shù)調(diào)用。如果構(gòu)造函數(shù)調(diào)用突然完成,則此過程出于同樣的原因突然完成;否則,繼續(xù)執(zhí)行步驟5。
此構(gòu)造函數(shù)不以同一類中的另一個(gè)構(gòu)造函數(shù)的顯式構(gòu)造函數(shù)調(diào)用開始(使用此方法)。如果此構(gòu)造函數(shù)用于對(duì)象以外的類,則此構(gòu)造函數(shù)將以超類構(gòu)造函數(shù)的顯式或隱式調(diào)用(使用超級(jí))開始。使用這五個(gè)步驟遞歸地評(píng)估超類構(gòu)造函數(shù)調(diào)用的參數(shù)和過程。如果構(gòu)造函數(shù)調(diào)用突然完成,則此過程出于同樣的原因突然完成。否則,繼續(xù)執(zhí)行步驟4。
為該類執(zhí)行實(shí)例初始化器和實(shí)例變量初始化器,將實(shí)例變量初始化器的值按從左到右的順序分配給相應(yīng)的實(shí)例變量,這些變量在類的源代碼中以文本形式出現(xiàn)。如果執(zhí)行這些初始化程序中的任何一個(gè)都會(huì)導(dǎo)致異常,那么將不再處理其他初始化器,并且該過程在相同的異常下突然完成。否則,繼續(xù)執(zhí)行步驟5。
執(zhí)行此構(gòu)造函數(shù)主體的其余部分。如果該執(zhí)行突然完成,則此過程出于同樣的原因突然完成。否則,此過程將正常完成。

TA貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超9個(gè)贊
java:
import javax.annotation.PostConstruct;/** * Test steps of instance creation. * * @author eric * @date Jan 7, 2018 3:31:12 AM */public class InstanceCreateStepTest { public static void main(String[] args) { new Sub().hello(); System.out.printf("%s\n", "------------"); new Sub().hello(); }}class Base { static { System.out.printf("%s - %s - %s\n", "base", "static", "block"); } { System.out.printf("%s - %s - %s\n", "base", "instance", "block"); } public Base() { System.out.printf("%s - %s\n", "base", "constructor"); } @PostConstruct public void init() { System.out.printf("%s - %s\n", "base", "PostConstruct"); } public void hello() { System.out.printf("%s - %s\n", "base", "method"); }}class Sub extends Base { static { System.out.printf("%s - %s - %s\n", "sub", "static", "block"); } { System.out.printf("%s - %s - %s\n", "sub", "instance", "block"); } public Sub() { System.out.printf("%s - %s\n", "sub", "constructor"); } @PostConstruct public void init() { System.out.printf("%s - %s\n", "sub", "PostConstruct"); } @Override public void hello() { // super.hello(); System.out.printf("%s - %s\n", "sub", "method"); }}
處決:
小貼士:
標(biāo)記的方法 @PostConstruct
不會(huì)被調(diào)用,除非您在某個(gè)容器中調(diào)用它,例如 Spring-boot
,因?yàn)樗蕾囉谀切┤萜鱽韺?shí)現(xiàn)注釋,如 @PostConstruct
.
添加回答
舉報(bào)