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