區(qū)分Java的方法覆蓋與變量覆蓋
首先,我們看看關(guān)于重載,和覆蓋(重寫)的簡明定義:
方法重載:如果有兩個方法的方法名相同,但參數(shù)不一致,哪么可以說一個方法是另一個方法的重載。
方法覆蓋:如果在子類中定義一個方法,其名稱、返回類型及參數(shù)簽名正好與父類中某個方法的名稱、返回類型及參數(shù)簽名相匹配,那么可以說,子類的方法覆蓋了父類的方法
我們重點(diǎn)說說覆蓋問題,以如下代碼為例:
public class People {
public String getName() {
return "people";
}
}
public class Student extends People {
public String getName() {
return "student";
}
}
public static void main(String[] args) {
People p=new People();
System.out.println(p.getName());//運(yùn)行結(jié)果為people
Student s=new Student();
System.out.println(s.getName());//運(yùn)行結(jié)果為student
People pp=new Student();
System.out.println(pp.getName());//運(yùn)行結(jié)果為student
}
上述結(jié)果說明:student類的getName方法成功覆蓋了父類的方法
我們再來看看變量的覆蓋:
public class People {
protected String name="people";
}
public class Student extends People {
protected String name="student";
}
public static void main(String[] args) {
People p=new People();
System.out.println(p.name);//運(yùn)行結(jié)果為people
Student s=new Student();
System.out.println(s.name);//運(yùn)行結(jié)果為student
People pp=new Student();
System.out.println(pp.name);//運(yùn)行結(jié)果為people
}
通過運(yùn)行結(jié)果我發(fā)現(xiàn):變量的覆蓋實(shí)際上與方法的不盡相同。
用我自己的話說:變量的覆蓋最多只能算是半吊子的覆蓋。
要不然,向上轉(zhuǎn)換與不會發(fā)生數(shù)據(jù)丟失現(xiàn)象
People pp=new Student(); System.out.println(pp.name);//運(yùn)行結(jié)果為people
就我個人的經(jīng)驗(yàn)來說:變量的覆蓋很容易讓人犯錯誤.讓人感覺又回到了C++的繼承[這里不是指C++帶virtual的繼承]
最后我們再來看一段代碼:
public class People {
protected String name="people";
public String getName() {
return name;
}
}
public class Student extends People {
protected String name="student";
public String getName() {
return name;
}
}
main(String[] args) {
People p=new People();
System.out.println(p.getName());//運(yùn)行結(jié)果為people
Student s=new Student();
System.out.println(s.getName());//運(yùn)行結(jié)果為student
People pp=new Student();
System.out.println(pp.getName());//運(yùn)行結(jié)果為student
}
顯然,如此的覆蓋,才是對我們更有用的覆蓋,因?yàn)檫@樣才能達(dá)到:把具體對象抽象為一般對象的目的,實(shí)同多態(tài)性
以上只是我個人的看法,有不對的地方歡迎指出來討論。
相關(guān)文章
詳解java動態(tài)代理的2種實(shí)現(xiàn)方式
目前Java開發(fā)包中包含了對動態(tài)代理的支持,但是其實(shí)現(xiàn)只支持對接口的的實(shí)現(xiàn)。這篇文章主要介紹了詳解java動態(tài)代理的2種實(shí)現(xiàn)方式 ,有興趣的可以了解一下。2016-11-11
使用java實(shí)現(xiàn)http多線程斷點(diǎn)下載文件(二)
下載工具我想沒有幾個人不會用的吧,前段時(shí)間比較無聊,花了點(diǎn)時(shí)間用java寫了個簡單的http多線程下載程序,我實(shí)現(xiàn)的這個http下載工具功能很簡單,就是一個多線程以及一個斷點(diǎn)恢復(fù),當(dāng)然下載是必不可少的,需要的朋友可以參考下2012-12-12
基于Java的界面開發(fā)詳細(xì)步驟(用戶注冊登錄)
通過一段時(shí)間Java Web的學(xué)習(xí),寫一個簡單的注冊登陸界面來做個總結(jié),這篇文章主要給大家介紹了基于Java的界面開發(fā)(用戶注冊登錄)的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01
Java的Lambda表達(dá)式和Stream流的作用以及示例
這篇文章主要介紹了Java的Lambda表達(dá)式和Stream流簡單示例,Lambda允許把函數(shù)作為一個方法的參數(shù),使用Lambda表達(dá)式可以寫出更簡潔、更靈活的代碼,而其作為一種更緊湊的代碼風(fēng)格,使Java的語言表達(dá)能力得到了提升,需要的朋友可以參考下2023-05-05
Java多線程CountDownLatch的實(shí)現(xiàn)
本文主要介紹了Java多線程CountDownLatch的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
Java并發(fā)包線程池ThreadPoolExecutor的實(shí)現(xiàn)
本文主要介紹了Java并發(fā)包線程池ThreadPoolExecutor的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04
Java基于正則表達(dá)式實(shí)現(xiàn)xml文件的解析功能詳解
這篇文章主要介紹了Java基于正則表達(dá)式實(shí)現(xiàn)xml文件的解析功能,結(jié)合實(shí)例形式分析了java使用正則表達(dá)式針對xml文件節(jié)點(diǎn)的相關(guān)操作技巧,需要的朋友可以參考下2017-08-08

