多態和重載

方法重載的要求就是兩個同一不同:同一個類中方法名相同,參數列表不同。至於方法的其他部分,如方法返回值類型、修飾符等,與方法重載沒有任何關係

 

爲什麼方法返回值類型不能用於區分重載的方法?

對於int f(){} 和 void f(){}兩個方法,如果這樣調用 int result = f();系統可以識別時調用返回值類型爲int的方法,但是Java調用方法時可以忽略方法的返回值,如果採用如下方法來調用f();你能判斷是調用哪個方法嗎?如果你尚且不能判斷,那麼Java系統也會糊塗,系統一糊塗,那肯定是你錯了。

 

Java代碼  收藏代碼

  1. public class Varargs{  
  2.     public static void test(int a,String... books){  
  3.         for(String book : books){  
  4.             System.out.println(book);  
  5.         }  
  6.     }  
  7. }  

 

如果同一個類定義了test(String... books)和test(String book)方法,如果只傳入一個參數,系統會執行重載test(String book)方法,如果需要調用test(String... books)方法,又只想傳入一個字符串數組,則可以採用傳入字符串數組的形式

test(new String[]{"aaa"});

一般不推薦重載形參長度可變的方法。沒有意義,降低了可讀性

 

二、多態

相同類型的變量,調用同一個方法呈現出多種不同的行爲特徵,這就是多態

 

Java代碼  收藏代碼
  1. package com.hb.lucence.test;  
  2.   
  3. public class BaseClass {  
  4.     public int book = 7;  
  5.     public void base(){  
  6.         System.out.println("父類的普通方法");  
  7.     }  
  8.     public void test(){  
  9.         System.out.println("父類的被覆蓋的方法");  
  10.     }  
  11. }  

 

 

Java代碼  收藏代碼
  1. package com.hb.lucence.test;  
  2.   
  3. import org.junit.Test;  
  4.   
  5. public class SubClass extends BaseClass{  
  6.     public String book = "我是一本書";  
  7.     public void test(){  
  8.         System.out.println("子類覆蓋父類的方法");  
  9.     }  
  10.     public void sub(){  
  11.         System.out.println("子類普通方法");  
  12.     }  
  13.       
  14.     @Test  
  15.     public void classtest(){  
  16.         BaseClass bc = new BaseClass();  
  17.         System.out.println(bc.book);//7  
  18.         bc.base();//父類的普通方法  
  19.         bc.test();//父類的被覆蓋的方法  
  20.         System.out.println("---------------------");  
  21.         SubClass sc = new SubClass();  
  22.         System.out.println(sc.book);//我是一本書  
  23.         sc.sub();//子類普通方法  
  24.         sc.test();//子類覆蓋父類的方法  
  25.         System.out.println("---------------------");  
  26.         BaseClass polymorphic = new SubClass();  
  27.         System.out.println(polymorphic.book);//7  
  28.         polymorphic.test();//子類覆蓋父類的方法  
  29.           
  30.     }  
  31. }  

 與方法不同的是,對象的Field則不具備多態

 

引用變量在編譯階段只能調用其編譯時類型所具有的方法,但是運行時則執行它運行時類型具有的方法。因此,編寫java代碼時,引用變量只能調用聲明改變量時所用類裏包含的方法。例如,通過Object p = new Person()代碼定義了一個變量P,則這個P只能調用Object類的方法,而不能調用Person類裏定義的方法

 

通過引用變量來訪問其包含的實例Field時,系統總是試圖訪問它編譯時類型所定義的Field,而不是他運行時候類型所定義的Field

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章