關於靜態代碼塊和匿名代碼塊以及結構體在程式運行過程中的調用順序實驗 今天學習JAVA看到了static修飾符部分,講到了有關匿名代碼和靜態代碼部分。此時又突然想到前面所學關於new是調用類的結構體知識,同時結合繼承關係,想看看在這些條件下匿名代碼塊、靜態代碼塊以及類構造體的調用順序。 編寫了 ...
關於靜態代碼塊和匿名代碼塊以及結構體在程式運行過程中的調用順序實驗
今天學習JAVA看到了static修飾符部分,講到了有關匿名代碼和靜態代碼部分。此時又突然想到前面所學關於new是調用類的結構體知識,同時結合繼承關係,想看看在這些條件下匿名代碼塊、靜態代碼塊以及類構造體的調用順序。
編寫了三個小文件,代碼如下:
- Application(帶main()執行函數)
- Person(父類)
- Student(子類)
程式運行結果如下:
首先看第一部分執行結果,對於簡單的new且類型與指向相同時,運行結果表明,首先將調用Person的2個代碼塊,之後再調用類構造體。代碼塊又以靜態代碼塊優先調用。
第二部分運行結果就很有意思了。當類中出現繼承關係時,首先讀取Student類時先載入了Student的靜態代碼。這個可以理解,帶有static修飾符的方法和屬性在類被調用時也會一併載入。但是實例化過程中,由於繼承關係的出現,程式進入Person類中並依次載入了匿名代碼塊以及類構造體,之後再返回Student類中載入匿名代碼塊和構造體。因此可以看到,出現繼承時會載入父類中的匿名和類構造體,而不會載入靜態代碼塊,即一部分對類的初始設定就不會載入,而僅僅在實例化後讀取父類中的方法。
第三部分代碼略有不同,"Person student1 = new Student();",此時類型為Person但是實例化調用了Student。此時從結果可以看到,整個運行結果中靜態代碼塊就沒出現了,取而代之的是從左邊的Person類的匿名代碼塊-->類構造體再到右邊的Student類的匿名代碼塊-->類構造體。
實驗總結:
-
靜態代碼在new中是否調用取決於類型和指向是否相同。如果相同,則出現調用,且一定在首位;如果不同則不調用。
-
如果出現在new中出現繼承關係或者類型和指向不一致時,會依次調用父類的匿名代碼塊、構造體以及子類的匿名代碼塊和構造體。
後話:
這個東西只是我突發奇想整的,具體能怎麼用還有待觀察,畢竟菜鳥剛剛入坑。同時,如果父類往上還有繼承關係會出現什麼情況,有興趣的可以自己去試試。如果有懂這部分背後原理的大佬可以解釋一下,本人感激不盡。