重載與重寫

先看下 定義!!!

方法重載(overloading method)
       方法重載是讓類以統一的方式處理不同類型數據的一種手段。Java的方法重載,就是在類中可以創建多個方法,它們具有相同的名字,但具有不同的參數和不同的定義。調用方法時通過傳遞給它們的不同個數和類型的參數來決定具體使用哪個方法, 這就是多態性。下面是一個方法重載的例子:
class  MethodOverloading {
     viod receive(int i) {
System.out.println("Received one int data");
System.out.println("i="+i);
     }
      viod receive(float f) {
System.out.println("Received one float data");
System.out.println("f="+f);
     }
     viod receive(String s) {
System.out.println("Received a String");
System.out.println("s="+s);
     }
    }

注意,Java的方法重載要求同名的方法必須有不同的參數表,僅有返回類型不同是不足以區分兩個重載的方法。

方法重寫(overiding method)
       在Java中,子類可繼承父類中的方法,而不需要重新編寫相同的方法。但有時子類並不想原封不動地繼承父類的方法,而是想作一定的修改,這就需要採用方法的重寫。方法重寫又稱方法覆蓋。 若子類中的方法與父類中的某一方法具有相同的方法名、返回類型和參數表,則新方法將覆蓋原有的方法。 如需父類中原有的方法,可使用super關鍵字,該關鍵字引用了當前類的父類

 

 

Overloaded的方法是可以改變返回值的類型。--重載


這句話是正確的,唯一區分方法重載的是方法的參數列表不同,當參數列表不同時就可改變其返回類型

 

看下解釋-----

 

 在Java1.4及以前,子類方法如果要覆蓋超類的某個方法,必須具有完全相同的方法簽名,包括返回值也必須完全一樣。
Java5.0放寬了這一限制,只要子類方法與超類方法具有相同的方法簽名,或者子類方法的返回值是超類方法的子類型,就可以覆蓋。這樣有什麼好處呢?以Object類的clone方法爲例:
class Object {
 ...
 public Object clone() { ... }
}
在5.0以前,如果子類需要重載clone方法,必須像下面這樣寫代碼:
class Point {
 public int x;
 public int y;
 public Point(int x, int y) { this.x=x; this.y=y; }
 public Object clone() { return new Point(x,y); }
}
雖然在我們的Point類裏,clone方法總是返回一個Point類型的對象,但卻必須把返回類型寫成Object,在外部使用clone方法時也必須使用惱人的強制類型轉換。
在Java5.0以後,我們就可以利用新的覆蓋規則,像下面這樣編寫代碼:
class Point {
 public int x;
 public int y;
 public Point(int x, int y) { this.x=x; this.y=y; }
 public Point clone() { return new Point(x,y); }
}
這樣,我們就可以直接使用Point p2 = p1.clone(); 而不用強制類型轉換了。
 
2.泛型重載
       Java的方法重載一般指在同一個類中的兩個同名方法,規則很簡單:兩個方法必須具有不同的方法簽名。換句話說,就是這兩個方法的參數必須不相同,使得編譯器能夠區分開這兩個重載的方法。由於編譯器不能僅僅通過方法的返回值類型來區分重載方法,所以如果兩個方法只有返回類型不同,其它完全一樣,編譯是不能通過的。
在泛型方法的重載時,這個規則稍微有一點變化。先看下面代碼:
class Overloaded {
 public static int sum(List<Integer> ints) {
    int sum = 0;
    for (int i : ints) sum += i;
    return sum;
 }
 public static String sum(List<String> strings) {
    StringBuffer sum = new StringBuffer();
    for (String s : strings) sum.append(s);
    return sum.toString();
 }
}
上面是兩個泛型方法的重載例子,由於Java的泛型採用擦除法實現,List<Integer>和List<String>在運行時是完全一樣的,都是List類型。也就是,擦除後的方法簽名如下:
int sum(List)
String sum(List)
Java允許這兩個方法進行重載,雖然它們的方法簽名相同,只有返回值類型不同。這在兩個普通方法的重載中是不允許的。當然了,如果兩個泛型方法的參數在擦除後相同,而且返回值類型也完全一樣,那編譯肯定是不能通過的。
類似地,一個類不能同時繼承兩個具有相同擦除類型的父類,也不能同時實現兩個具有相同擦除的接口。如Class A implements Comparable<Integer>, Comparable<Long>。
總結一下,兩個泛型方法在擦除泛型信息後,如果具有相同的參數類型,而返回值不一樣,是可以進行重載的。Java有足夠的信息來區分這兩個重載的方法。


本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/jk88811/archive/2007/09/21/1794866.aspx

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