java方法不可覆盖_详解Java构造方法为什么不能覆盖,我的钻牛角尖病又犯了.......
一
看Think in Java,遇到個程序
classEgg2 {protected classYolk {publicYolk() {
System.out.println("Egg2.Yolk()");
}public voidf() {
System.out.println("Egg2.Yolk.f()");
}
}private Yolk y = newYolk();publicEgg2() {
System.out.println("New Egg2()");
}public voidinsertYolk(Yolk yy) {
y=yy;
}public voidg() {
y.f();
}
}public class BigEgg2 extendsEgg2 {public class Yolk extendsEgg2.Yolk {publicYolk() {
System.out.println("BigEgg2.Yolk()");
}public voidf() {
System.out.println("BigEgg2.Yolk.f()");
}
}publicBigEgg2() {
insertYolk(newYolk());
}public static voidmain(String[] args) {//Egg2 e1 = null;//Egg2 e2 = new BigEgg2();//new Egg2();
newBigEgg2();//e2.g();
}
}///:~
輸出
Egg2.Yolk()
New Egg2()
Egg2.Yolk()
BigEgg2.Yolk()
二
其實基本上我根據(jù)后面的幾個注釋,也大概明白了看的順序構(gòu)造順序是什么,見圖
構(gòu)造順序圖
三
但是,看了輸出,我就納悶為什么,為什么第三行不是BigEgg2.Yolk(),不能覆蓋嗎?
Egg2.Yolk()
New Egg2()
Egg2.Yolk()
BigEgg2.Yolk()
四
分析一下
BigEgg2是Egg2的子類,他們都有Yolk的內(nèi)部類,而且BigEgg2.Yolk繼承了Egg2.Yolk。注意此處,同名類可以繼承。
那么,他們構(gòu)造方法為什么不能覆蓋,都是Public Yolk(){}。
當(dāng)然,網(wǎng)上都說子類繼承父類除構(gòu)造方法以外的所有方法,但這是結(jié)果,我要知道為什么!!
五
先說幾個錯誤的觀點
1.
有說構(gòu)造方法的方法名與類名必須一樣,父子類不能同名,故不能繼,所以不能覆蓋構(gòu)造方法。
這個不用多說,這個例子,就是大神寫出來打這樣說的人的臉的。
2.
有說因為子類繼承父類的時候,先運行父類構(gòu)造函數(shù);具體的說就是運行父類時就會先“調(diào)用”父類的構(gòu)造函數(shù),注意“調(diào)用”和繼承不是一個含義,實質(zhì)上是“自動運行”。
這個強行用中文語法來解釋的,達到中文6級了啊。
3.
有說構(gòu)造方法不是成員函數(shù),故不能繼承,所以談不上覆蓋。
這個真的有道理,是java官方文檔上的。大多數(shù)人找到這里估計就滿足了。
但是,跟太陽從東方升起西方落下那樣,我想知道為甚么這么設(shè)計啊啊啊啊啊啊!!!!!
4.
正確答案
(1).構(gòu)造器代表這個類本身,在創(chuàng)建之時申請內(nèi)存。
(2).子類創(chuàng)建的時候,會默認在構(gòu)造方法的第一行調(diào)用父類的默認構(gòu)造方法-,若修改了必須顯示調(diào)用。(這就是為什么創(chuàng)建子類時先創(chuàng)建完父類的原因了)
那么很明顯了,要是同名類之間可以覆蓋了,子類創(chuàng)建時就是創(chuàng)建了兩個自己而沒有父類。
Java設(shè)計的時候,他們絕對想到有些人會像強迫癥那樣折騰個同名類繼承,然后實現(xiàn)構(gòu)造覆蓋的場景吧....
總結(jié)
構(gòu)造方法是唯一的,不能又造爸爸又造兒子
總結(jié)
以上是生活随笔為你收集整理的java方法不可覆盖_详解Java构造方法为什么不能覆盖,我的钻牛角尖病又犯了.......的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java break和return的区别
- 下一篇: java开源服务框架_Java框架服务