3 回答

TA貢獻(xiàn)2051條經(jīng)驗 獲得超10個贊
對象構(gòu)建的順序是:
變量聲明和初始化
實例構(gòu)造函數(shù)塊
constructor
如果一個類有父類,則在實際類之前先為父類完成相同的順序。
父母第一
整數(shù) = 9
首先評估,num
設(shè)置為 9(父母的 1)
父構(gòu)造函數(shù)代碼...9
實例初始化塊在構(gòu)造函數(shù)(父類的 2.)之前執(zhí)行
父構(gòu)造函數(shù)運(yùn)行
構(gòu)造函數(shù)被調(diào)用(parent's 3.)
兒童節(jié)目...0
Parent
調(diào)用的構(gòu)造函數(shù)show()
。show()
被覆蓋,因此Child
調(diào)用了。
孩子的 1. 和 2. 還沒有被調(diào)用,因此 overriding num
inChild
仍然是 0。*1
然后孩子
整數(shù) = 8
Child
1. 被評估
子構(gòu)造函數(shù)代碼...8
Child
的 2.num
在此之后設(shè)置為 10。
子構(gòu)造函數(shù)運(yùn)行
Child
的 3。
兒童節(jié)目...10
Child
的構(gòu)造函數(shù)調(diào)用show()
。
*1:
這就是為什么final
在構(gòu)造函數(shù)中調(diào)用非方法是非常危險的。方法往往依賴于被初始化的成員變量;他們不是在這一點(diǎn)上。
NullPointerException
如果這是一個非原始變量,如果您的方法試圖訪問它,您很可能會遇到 a 。

TA貢獻(xiàn)1852條經(jīng)驗 獲得超1個贊
當(dāng) java 創(chuàng)建一個子類時,它必須調(diào)用super()
初始化父類——這樣它就可以在超類或其他活動中實例化私有字段。(這不會創(chuàng)建父類的對象。)這就是您看到的原因Parent constructor code...9
- 它正在調(diào)用父代碼,并打印父類的num
.
因為您創(chuàng)建了一個子類,所以在父構(gòu)造函數(shù)中show()
調(diào)用了子類。這就是為什么在構(gòu)造函數(shù)中調(diào)用非 final 方法是危險的——如果子對象覆蓋了它們,則將調(diào)用子對象的方法。
孩子的num
是 0 因為Java 將成員變量初始化為默認(rèn)值,而您的代碼還沒有機(jī)會將其設(shè)置為 10。
至于你的子代碼,它num
沒有被覆蓋,它被隱藏了——只有方法可以被覆蓋。這就是為什么您的孩子show()
在正確初始化后將其顯示為 10 的原因。如果你想訪問父變量,你可以用 來實現(xiàn)super.num
,但這通常被認(rèn)為是不好的做法,因為它會引起混淆。

TA貢獻(xiàn)1810條經(jīng)驗 獲得超4個贊
我認(rèn)為這是因為你的構(gòu)造函數(shù)自動調(diào)用超類構(gòu)造函數(shù)。(對于我們的第一個問題。)盡管如此,你重寫了 show 所以當(dāng)它遇到這個方法時,它調(diào)用子方法
添加回答
舉報