更新時間:2020-04-21 14:22:50 來源:動力節點 瀏覽5602次
JAVA本身并不提供子類“覆蓋”父類成員變量的方法,而事實上,從面相對象的角度上來說,子類也不應當可以“覆蓋”父類的成員變量。但有時候我們就是有這種需求,比如:
Java
我們期望能夠打印出
Dad
但實際上會打印出
Person
原因分析
實際上,即使子類聲明了與父類完全一樣的成員變量,也不會覆蓋掉父類的成員變量。而是在子類實例化時,會同時定義兩個成員變量,子類也可以同時訪問到這兩個成員變量,但父類不能訪問到子類的成員變量(父類不知道子類的存在)。而具體在方法中使用成員變量時,究竟使用的是父類還是子類的成員變量,則由方法所在的類決定;即,方法在父類中定義和執行,則使用父類的成員變量,方法在子類中定義(包括覆蓋父類方法)和執行,則使用子類的成員變量。
解決方法
采用get()/set()
Java
得到結果:
Dad
由于dad.getName()執行的是子類中重載父類的getName(),因此返回的也是子類中定義的name。這種方法最為推薦,但用起來也繁瑣一些。因為這種方法同時維護了兩個相同的成員變量,因此使用起來也得小心一些。
使用父類成員函數
Java
得到結果:
Dad
這種方法是在子類的構造函數上做文章。子類的hisName即子類自己的成員變量,但只在構造函數中使用,而在構造函數中就是通過super給父類的成員變量賦值。這樣做的好處就是只有一個成員變量,沒有出現真正的“覆蓋”的問題,而且父類和子類中的方法也可以放心大膽用這個成員變量,不用擔心隱藏的問題;壞處當然就是不太“正規”了。
通過static塊
Java
得到結果:
Dad
這個方法和上面的那個很像,但從原理上來說還是有些區別的。static塊會在類初始化而不是實例化時被執行,而父類中的static成員變量會在子類static塊執行前就定義完成,所以子類初始化時會修改父類的成員變量值,子類實例化時自然得到的父類成員變量值也是修改過的,這樣完成了“覆蓋”。
這種方法就像:
Java
publicclassDadextendsPerson{
name="Dad";
}
但上面這段代碼是錯誤的,JAVA中變量是不能在方法之外進行賦值操作的;而static塊恰恰是利用了JAVA會無條件執行staitc塊這一特性,達到了這個目的。這種方法說壞處的話,估計就是成員變量必須是static了。
以上就是動力節點java培訓機構的小編針對“Java基礎學習:java覆蓋父類的方法”的內容進行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業老師隨時為你服務。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習