區(qū)分Java的方法覆蓋與變量覆蓋
首先,我們看看關(guān)于重載,和覆蓋(重寫(xiě))的簡(jiǎn)明定義:
方法重載:如果有兩個(gè)方法的方法名相同,但參數(shù)不一致,哪么可以說(shuō)一個(gè)方法是另一個(gè)方法的重載。
方法覆蓋:如果在子類(lèi)中定義一個(gè)方法,其名稱(chēng)、返回類(lèi)型及參數(shù)簽名正好與父類(lèi)中某個(gè)方法的名稱(chēng)、返回類(lèi)型及參數(shù)簽名相匹配,那么可以說(shuō),子類(lèi)的方法覆蓋了父類(lèi)的方法
我們重點(diǎn)說(shuō)說(shuō)覆蓋問(wè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é)果說(shuō)明:student類(lèi)的getName方法成功覆蓋了父類(lèi)的方法
我們?cè)賮?lái)看看變量的覆蓋:
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
}
通過(guò)運(yùn)行結(jié)果我發(fā)現(xiàn):變量的覆蓋實(shí)際上與方法的不盡相同。
用我自己的話說(shuō):變量的覆蓋最多只能算是半吊子的覆蓋。
要不然,向上轉(zhuǎn)換與不會(huì)發(fā)生數(shù)據(jù)丟失現(xiàn)象
People pp=new Student(); System.out.println(pp.name);//運(yùn)行結(jié)果為people
就我個(gè)人的經(jīng)驗(yàn)來(lái)說(shuō):變量的覆蓋很容易讓人犯錯(cuò)誤.讓人感覺(jué)又回到了C++的繼承[這里不是指C++帶virtual的繼承]
最后我們?cè)賮?lái)看一段代碼:
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
}
顯然,如此的覆蓋,才是對(duì)我們更有用的覆蓋,因?yàn)檫@樣才能達(dá)到:把具體對(duì)象抽象為一般對(duì)象的目的,實(shí)同多態(tài)性
以上只是我個(gè)人的看法,有不對(duì)的地方歡迎指出來(lái)討論。
相關(guān)文章
Java 高并發(fā)七:并發(fā)設(shè)計(jì)模型詳解
本文主要介紹Java高并發(fā) 并發(fā)設(shè)計(jì)模型的知識(shí),這里主要講解 1. 什么是設(shè)計(jì)模式 2. 單例模式 3. 不變模式 4. Future模式 5. 生產(chǎn)者消費(fèi)者,有需要的小伙伴可以參考下2016-09-09
用html css javascript打造自己的RIA圖文教程
用html&css&javascript打造自己的RIA之一,包括了配置等2009-07-07
(starters)springboot-starter整合阿里云datahub方式
這篇文章主要介紹了(starters)springboot-starter整合阿里云datahub方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
Spring?boot?Jpa添加對(duì)象字段使用數(shù)據(jù)庫(kù)默認(rèn)值操作
這篇文章主要介紹了Spring?boot?Jpa添加對(duì)象字段使用數(shù)據(jù)庫(kù)默認(rèn)值操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
Java常用正則表達(dá)式驗(yàn)證工具類(lèi)RegexUtils.java
相信大家對(duì)正則表達(dá)式一定都有所了解和研究,這篇文章主要為大家分享了Java 表單注冊(cè)常用正則表達(dá)式驗(yàn)證工具類(lèi),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11
Java 高并發(fā)的三種實(shí)現(xiàn)案例詳解
這篇文章主要介紹了Java 高并發(fā)的三種實(shí)現(xiàn)案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08

