程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 淺談Java的方法覆蓋與變量覆蓋

淺談Java的方法覆蓋與變量覆蓋

編輯:關於JAVA

首先,我們看看關於重載,和覆蓋(重寫)的簡明定義:

方法重載:如果有兩個方法的方法名相同,但參數不一致,哪麼可以說一個方法是另一個方法的重載。

方法覆蓋:如果在子類中定義一個方法,其名稱、返回類型及參數簽名正好與父類中某個方法的名稱、返回類型及參數簽名相匹配,那麼可以說,子類的方法覆蓋了父類的方法

我們重點說說覆蓋問題,以如下代碼為例:

  1. public class People {
  2. public String getName() {
  3. return "people";
  4. }
  5. }
  6. public class Student extends People {
  7. public String getName() {
  8. return "student";
  9. }
  10. }
  11. public static void main(String[] args) {
  12.  People p=new People();
  13. System.out.println(p.getName());//運行結果為people
  14.  Student s=new Student();
  15. System.out.println(s.getName());//運行結果為student
  16. People pp=new Student();
  17. System.out.println(pp.getName());//運行結果為student
  18. }

上述結果說明:student類的getName方法成功覆蓋了父類的方法

我們再來看看變量的覆蓋:

  1. public class People {
  2. protected String name="people";
  3. }
  4. public class Student extends People {
  5. protected String name="student";
  6. }
  7. public static void main(String[] args) {
  8. People p=new People();
  9. System.out.println(p.name);//運行結果為people
  10. Student s=new Student();
  11. System.out.println(s.name);//運行結果為student
  12. People pp=new Student();
  13. System.out.println(pp.name);//運行結果為people
  14. }

通過運行結果我發現:變量的覆蓋實際上與方法的不盡相同。

用我自己的話說:變量的覆蓋最多只能算是半吊子的覆蓋。

要不然,向上轉換與不會發生數據丟失現象

  1. People pp=new Student();
  2. System.out.println(pp.name);//運行結果為people

就我個人的經驗來說:變量的覆蓋很容易讓人犯錯誤.讓人感覺又回到了C++的繼承[這裡不是指C++帶virtual的繼承]

最後我們再來看一段代碼:

  1. public class People {
  2. protected String name="people";
  3. public String getName() {
  4. return name;
  5. }
  6. }
  7. public class Student extends People {
  8. protected String name="student";
  9. public String getName() {
  10. return name;
  11. }
  12. }
  1. main(String[] args) {
  2. People p=new People();
  3. System.out.println(p.getName());//運行結果為people
  4. Student s=new Student();
  5. System.out.println(s.getName());//運行結果為student
  6. People pp=new Student();
  7. System.out.println(pp.getName());//運行結果為student
  8. }

顯然,如此的覆蓋,才是對我們更有用的覆蓋,因為這樣才能達到:把具體對象抽象為一般對象的目的,實同多態性

以上只是我個人的看法,有不對的地方歡迎指出來討論。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved