淺談Java的方法覆蓋與變量覆蓋
首先,我們看看關(guān)于重載,和覆蓋(重寫)的簡(jiǎn)明定義:
方法重載:如果有兩個(gè)方法的方法名相同,但參數(shù)不一致,哪么可以說(shuō)一個(gè)方法是另一個(gè)方法的重載。
方法覆蓋:如果在子類中定義一個(gè)方法,其名稱、返回類型及參數(shù)簽名正好與父類中某個(gè)方法的名稱、返回類型及參數(shù)簽名相匹配,那么可以說(shuō),子類的方法覆蓋了父類的方法
我們重點(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類的getName方法成功覆蓋了父類的方法
我們?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)討論。
原文鏈接:http://blog.csdn.net/kuangxiang_panpan/article/details/7443046
【編輯推薦】