關于靜態代碼塊和匿名代碼塊以及結構體在程式運行程序中的呼叫順序實驗
? 今天學習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中出現繼承關系或者型別和指向不一致時,會依次呼叫父類的匿名代碼塊、構造體以及子類的匿名代碼塊和構造體,
后話:
? 這個東西只是我突發奇想整的,具體能怎么用還有待觀察,畢竟菜鳥剛剛入坑,同時,如果父類往上還有繼承關系會出現什么情況,有興趣的可以自己去試試,如果有懂這部分背后原理的大佬可以解釋一下,本人感激不盡,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/544182.html
標籤:其他
上一篇:案例分析|如何消除代碼壞味道
