Java中方法的重寫與成員變量的隱藏
這篇文章討論了Java面向?qū)ο蟾拍钪幸粋€(gè)基本的概念–Field Hiding(隱藏成員變量)
在討論這個(gè)問(wèn)題之前,我們看一段特別特別簡(jiǎn)單的代碼,請(qǐng)問(wèn)一下方法的數(shù)據(jù)結(jié)果是什么?
/**
* @author Hollis 17/9/27.
*/ public class FieldOverriding {
public static void main(String[] args) {
Sub c1 = new Sub();
System.out.println(" c1.s : " + c1.s);
System.out.println(" c1.say : " + c1.say());
Super c2 = new Sub();
System.out.println(" c2.s : " + c2.s);
System.out.println(" c2.say : " + c2.say());
}
}
class Super {
String s = "Super";
String say(){
return "hello Super";
}
}
class Sub extends Super {
String s = "Sub";
String say(){
return "hello Sub";
}
}
輸出結(jié)果:
c1.s : Sub c1.say : hello Sub c2.s : Super c2.say : hello Sub
和你想的一樣嗎,如果一樣的話,那就不用繼續(xù)往下看了。因?yàn)檫@個(gè)本來(lái)就不難,知道了就行。
Java中的重寫
在深入理解Java中的重寫和重載中我們介紹過(guò):
在Java的子類與父類中有兩個(gè)名稱、參數(shù)列表都相同的方法的情況。由于他們具有相同的方法簽名,所以子類中的新方法將覆蓋父類中原有的方法。
正式因?yàn)镴ava在繼承中有方法的重寫,所以,這也體現(xiàn)了Java的動(dòng)態(tài)多態(tài)性。
成員變量在Java中能夠被重寫么?
上面的Java的重寫介紹中明確的說(shuō)了,重寫,指的是方法。并沒(méi)有提到成員變量。通過(guò)上面的例子,其實(shí)我們也可以發(fā)現(xiàn),成員變量并沒(méi)有被重寫。
所以,Java中,成員變量并不會(huì)被重寫。這里就有另外一個(gè)詞:隱藏。
Java中成員變量的隱藏
Java文檔中對(duì)隱藏域的定義:
Within a class, a field that has the same name as a field in the superclass hides the superclass's field, even if their types are different. Within the subclass, the field in the superclass cannot be referenced by its simple name. Instead, the field must be accessed through super. Generally speaking, we don't recommend hiding fields as it makes code difficult to read.
翻譯成中文:
在一個(gè)類中,子類中的成員變量如果和父類中的成員變量同名,那么即使他們類型不一樣,只要名字一樣。父類中的成員變量都會(huì)被隱藏。在子類中,父類的成員變量不能被簡(jiǎn)單的用引用來(lái)訪問(wèn)。而是,必須從父類的引用獲得父類被隱藏的成員變量,一般來(lái)說(shuō),我們不推薦隱藏成員變量,因?yàn)檫@樣會(huì)使代碼變得難以閱讀。
其實(shí),簡(jiǎn)單來(lái)說(shuō),就是子類不會(huì)去重寫覆蓋父類的成員變量,所以成員變量的訪問(wèn)不能像方法一樣使用多態(tài)去訪問(wèn)。
如何訪問(wèn)被隱藏的成員變量
其實(shí),通過(guò)前面的例子,和剛剛關(guān)于成員變量的介紹,其實(shí)你已經(jīng)知道了如何訪問(wèn)被隱藏的成員變量。 就是使用父類的引用來(lái)訪問(wèn)成員變量,如Super c2 = new Sub(); System.out.println(" c2.s : " + c2.s);。或者使用System.out.println(((Super)c1).s);。
總結(jié)
以上所述是小編給大家介紹的Java中方法的重寫與成員變量的隱藏,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- 詳解Java中方法重寫與重載的區(qū)別(面試高頻問(wèn)點(diǎn))
- Java如何重寫object類的equals方法詳解
- Java中final修飾的方法是否可以被重寫示例詳解
- Java重寫equals及hashcode方法流程解析
- 淺談java 重寫equals方法的種種坑
- Java繼承方法重寫實(shí)現(xiàn)原理及解析
- java子類調(diào)用父類的方法中包含子類重寫的實(shí)例方法
- Java自動(dòng)添加重寫的toString方法詳解
- java中為何重寫equals時(shí)必須重寫hashCode方法詳解
- Java編程關(guān)于子類重寫父類方法問(wèn)題的理解
- 重寫Java中的equals方法介紹
- Java基礎(chǔ)之方法重寫詳解
相關(guān)文章
StackTraceElement獲取方法調(diào)用棧信息實(shí)例詳解
這篇文章主要介紹了StackTraceElement獲取方法調(diào)用棧信息實(shí)例詳解,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-02-02
Spring Cloud Config與Bus整合實(shí)現(xiàn)微服務(wù)配置自動(dòng)刷新功能
通過(guò)整合SpringCloud Config與Spring Cloud Bus,實(shí)現(xiàn)了微服務(wù)配置的自動(dòng)刷新功能,這個(gè)機(jī)制允許一個(gè)微服務(wù)實(shí)例在配置更新時(shí)通過(guò)消息總線通知其他所有實(shí)例同步更新,從而保持配置的一致性并提升系統(tǒng)的運(yùn)維效率2024-10-10
使用Java找出兩個(gè)List中的重復(fù)元素三種方法
在Java編程中,我們經(jīng)常需要找出兩個(gè)列表(List)中的重復(fù)元素,在本文中,我們將探討三種方法來(lái)實(shí)現(xiàn)這一目標(biāo),需要的朋友可以參考下2023-10-10
eclipse配置tomcat10的詳細(xì)步驟總結(jié)
今天給大家?guī)?lái)的是關(guān)于Java的相關(guān)知識(shí),文章圍繞著eclipse配置tomcat10的詳細(xì)步驟展開,文中有非常詳細(xì)的介紹及圖文示例,需要的朋友可以參考下2021-06-06
JAVA多線程實(shí)現(xiàn)生產(chǎn)者消費(fèi)者的實(shí)例詳解
這篇文章主要介紹了JAVA多線程實(shí)現(xiàn)生產(chǎn)者消費(fèi)者的實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-06-06
JavaSwing實(shí)現(xiàn)小型學(xué)生管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了JavaSwing實(shí)現(xiàn)小型學(xué)生管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
Elasticsearch 映射參數(shù)詳解 fields
這篇文章主要介紹了fields Elasticsearch 映射參數(shù)fields,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07

