Java方法覆蓋和變數覆蓋的區別詳解
對於Java初學者來說,很容易將Java中的方法覆蓋、方法過載以及變數覆蓋互相混淆,本文主要來對Java中的方法覆蓋和方法過載進行詳細地卻分,並且用具體的程式碼來進行解釋。
首先,我們看看關於過載,和覆蓋(重寫)的簡明定義:
方法過載:如果有兩個方法的方法名相同,但引數不一致,哪麼可以說一個方法是另一個方法的過載。
方法覆蓋:如果在子類中定義一個方法,其名稱、返回型別及引數簽名正好與父類中某個方法的名稱、返回型別及引數簽名相匹配,那麼可以說,子類的方法覆蓋了父類的方法
我們重點說說覆蓋問題,以如下程式碼為例:
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());//執行結果為people Student s=new Student(); System.out.println(s.getName());//執行結果為student People pp=new Student(); System.out.println(pp.getName());//執行結果為student }
上述結果說明: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);//執行結果為people Student s=new Student(); System.out.println(s.name);//執行結果為student People pp=new Student(); System.out.println(pp.name);//執行結果為people }
通過執行結果我發現:變數的覆蓋實際上與方法的不盡相同。
用我自己的話說:變數的覆蓋最多隻能算是半吊子的覆蓋。
要不然,向上轉換與不會發生資料丟失現象
People pp=new Student(); System.out.println(pp.name);//執行結果為people
就我個人的經驗來說:變數的覆蓋很容易讓人犯錯誤.讓人感覺又回到了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());//執行結果為people Student s=new Student(); System.out.println(s.getName());//執行結果為student People pp=new Student(); System.out.println(pp.getName());//執行結果為student }
顯然,如此的覆蓋,才是對我們更有用的覆蓋,因為這樣才能達到:把具體物件抽象為一般物件的目的,實同多型性
以上只是我個人的看法,有不對的地方歡迎指出來討論。
相關文章
- PHP變數覆蓋漏洞小結PHP變數
- boblog任意變數覆蓋漏洞(二)變數
- 第9條:覆蓋equals時總要覆蓋hashCode方法
- Java基礎 成員變數的繼承與覆蓋Java變數繼承
- 企業WiFi覆蓋,解決覆蓋四大難題WiFi
- Java中的過載和覆蓋的細微差別 - rajivprabJava
- Mysql索引覆蓋MySql索引
- 最小圓覆蓋
- 提升的函式宣告會覆蓋同名變數宣告函式變數
- 程式碼覆蓋率與測試覆蓋率比較
- 語法:Python中的可覆蓋物件與不可覆蓋物件Python物件
- java覆蓋率檢測-jacocoJava
- EMMA 覆蓋率工具
- 《Hack與HHVM權威指南》——1.5.2覆蓋方法的型別型別
- C++中的覆蓋和隱藏C++
- 室外無線覆蓋解決方案
- MySQL 聚簇索引 和覆蓋索引MySql索引
- 隧道調頻廣播覆蓋系統數字選頻光纖拉遠漏纜覆蓋解決方案
- canvas 填充覆蓋描邊Canvas
- pHp程式碼覆蓋率PHP
- php實現矩形覆蓋PHP
- 程式碼覆蓋率分析
- 線段覆蓋問題
- 軟體測試培訓之:白盒測試的語句覆蓋法和判定覆蓋法
- Google Express現已覆蓋美國90%地區GoExpress
- 大學宿舍無線覆蓋解決方案
- 室外無線AP覆蓋解決方案
- 景區無線覆蓋客流熱力圖解決方案圖解
- 重寫、覆蓋、過載、多型幾個概念的區別分析多型
- istanbul 繞過 window 變數儲存覆蓋率資料變數
- 公司wifi覆蓋人數增多解決方案WiFi
- Java 程式碼覆蓋率調研報告Java
- MySQL 的覆蓋索引與回表MySql索引
- 超市無線覆蓋的需求分析
- 四、建立覆蓋網路--Flannel
- ESLint: 規則配置覆蓋EsLint
- 76. 最小覆蓋子串
- 高密度無線覆蓋解決方案