2 回答

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

TA貢獻1831條經驗 獲得超9個贊
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"); }}
處決:
小貼士:
標記的方法 @PostConstruct
不會被調用,除非您在某個容器中調用它,例如 Spring-boot
,因為它依賴于那些容器來實現注釋,如 @PostConstruct
.
添加回答
舉報