閱讀138 返回首頁    go 微軟 go windows


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

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

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

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

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

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

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

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

[java] view plain copy
 print?
  1. public class People {  
  2.     protected String name="people";  
  3.   
  4.       
  5. }  
  6. public class Student extends People {  
  7.       
  8.     protected String name="student";  
  9.           
  10. }  
  11. public static void main(String[] args) {  
  12.           
  13.                   
  14.         People p=new People();  
  15.         System.out.println(p.name);//運行結果為people  
  16.           
  17.         Student s=new Student();  
  18.         System.out.println(s.name);//運行結果為student  
  19.           
  20.         People pp=new Student();  
  21.         System.out.println(pp.name);//運行結果為people  
  22.   
  23.     }  


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

用我自己的話說:變量的覆蓋最多隻能算是半吊子的覆蓋.
要不然,向上轉換與不會發生數據丟失現象

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

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

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

[java] view plain copy
 print?
  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.       
  9.     protected String name="student";  
  10.     public String getName() {  
  11.         return name;  
  12.     }  
  13. }  
[java] view plain copy
 print?
  1. main(String[] args) {  
  2.           
  3.         People p=new People();  
  4.         System.out.println(p.getName());//運行結果為people  
  5.           
  6.         Student s=new Student();  
  7.         System.out.println(s.getName());//運行結果為student  
  8.           
  9.         People pp=new Student();  
  10.         System.out.println(pp.getName());//運行結果為student  
  11.   
  12.     }  


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

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

最後更新:2017-10-26 09:03:34

  上一篇:go  讀《騰訊傳》有感
  下一篇:go  Android熱修複