更新時間:2020-04-21 14:22:50 來源:動力節(jié)點 瀏覽5582次
JAVA本身并不提供子類“覆蓋”父類成員變量的方法,而事實上,從面相對象的角度上來說,子類也不應(yīng)當(dāng)可以“覆蓋”父類的成員變量。但有時候我們就是有這種需求,比如:
Java
我們期望能夠打印出
Dad
但實際上會打印出
Person
原因分析
實際上,即使子類聲明了與父類完全一樣的成員變量,也不會覆蓋掉父類的成員變量。而是在子類實例化時,會同時定義兩個成員變量,子類也可以同時訪問到這兩個成員變量,但父類不能訪問到子類的成員變量(父類不知道子類的存在)。而具體在方法中使用成員變量時,究竟使用的是父類還是子類的成員變量,則由方法所在的類決定;即,方法在父類中定義和執(zhí)行,則使用父類的成員變量,方法在子類中定義(包括覆蓋父類方法)和執(zhí)行,則使用子類的成員變量。
解決方法
采用get()/set()
Java
得到結(jié)果:
Dad
由于dad.getName()執(zhí)行的是子類中重載父類的getName(),因此返回的也是子類中定義的name。這種方法最為推薦,但用起來也繁瑣一些。因為這種方法同時維護(hù)了兩個相同的成員變量,因此使用起來也得小心一些。
使用父類成員函數(shù)
Java
得到結(jié)果:
Dad
這種方法是在子類的構(gòu)造函數(shù)上做文章。子類的hisName即子類自己的成員變量,但只在構(gòu)造函數(shù)中使用,而在構(gòu)造函數(shù)中就是通過super給父類的成員變量賦值。這樣做的好處就是只有一個成員變量,沒有出現(xiàn)真正的“覆蓋”的問題,而且父類和子類中的方法也可以放心大膽用這個成員變量,不用擔(dān)心隱藏的問題;壞處當(dāng)然就是不太“正規(guī)”了。
通過static塊
Java
得到結(jié)果:
Dad
這個方法和上面的那個很像,但從原理上來說還是有些區(qū)別的。static塊會在類初始化而不是實例化時被執(zhí)行,而父類中的static成員變量會在子類static塊執(zhí)行前就定義完成,所以子類初始化時會修改父類的成員變量值,子類實例化時自然得到的父類成員變量值也是修改過的,這樣完成了“覆蓋”。
這種方法就像:
Java
publicclassDadextendsPerson{
name="Dad";
}
但上面這段代碼是錯誤的,JAVA中變量是不能在方法之外進(jìn)行賦值操作的;而static塊恰恰是利用了JAVA會無條件執(zhí)行staitc塊這一特性,達(dá)到了這個目的。這種方法說壞處的話,估計就是成員變量必須是static了。
以上就是動力節(jié)點java培訓(xùn)機(jī)構(gòu)的小編針對“Java基礎(chǔ)學(xué)習(xí):java覆蓋父類的方法”的內(nèi)容進(jìn)行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業(yè)老師隨時為你服務(wù)。
相關(guān)閱讀
初級 202925
初級 203221
初級 202629
初級 203743