Java 重載與重寫(9)
重載(Overload)是讓類以統一的方式處理不同類型數據的一種手段,實質表現就是多個具有不同的參數個數或者類型的同名函數(返回值類型可隨意,不能以返回類型作為重載函數的區分標準)同時存在於同一個類中,是一個類中多態性的一種表現(調用方法時通過傳遞不同參數個數和參數類型來決定具體使用哪個方法的多態性)。
重寫(Override)是父類與子類之間的多態性,實質是對父類的函數進行重新定義,如果在子類中定義某方法與其父類有相同的名稱和參數則該方法被重寫,不過子類函數的訪問修飾權限不能小於父類的;若子類中的方法與父類中的某一方法具有相同的方法名、返回類型和參數表,則新方法將覆蓋原有的方法,如需父類中原有的方法則可使用 super 關鍵字。
重載規則:必須具有不同的參數列表; 可以有不同的返回類型;可以有不同的訪問修飾符;可以拋出不同的異常。
重寫規則:參數列表必須完全與被重寫的方法相同,否則不能稱其為重寫而是重載;返回類型必須一直與被重寫的方法相同,否則不能稱其為重寫而是重載;訪問修飾符的限制一定要大於等於被重寫方法的訪問修飾符;重寫方法一定不能拋出新的檢查異常或者比被重寫方法申明更加寬泛的檢查型異常,譬如父類方法聲明了一個檢查異常 IOException,在重寫這個方法時就不能拋出 Exception,只能拋出 IOException 的子類異常,可以拋出非檢查異常。
重載與重寫是 Java 多態性的不同表現,重寫是父類與子類之間多態性的表現,在運行時起作用(動態多態性,譬如實現動態綁定),而重載是一個類中多態性的表現,在編譯時起作用(靜態多態性,譬如實現靜態綁定)。
問:Java 構造方法能否被重寫和重載?
答:重寫是子類方法重寫父類的方法,重寫的方法名不變,而類的構造方法名必須與類名一致,假設父類的構造方法如果能夠被子類重寫則子類類名必須與父類類名一致才行,所以 Java 的構造方法是不能被重寫的。而重載是針對同一個的,所以構造方法可以被重載。
問:下面程序的運行結果是什麽,為什麽?
public class Demo { public boolean equals( Demo other) { System.out.println("use Demo equals." );return true; } public static void main(String[] args) { Object o1 = new Demo(); Object o2 = new Demo(); Demo o3 = new Demo(); Demo o4 = new Demo(); if(o1.equals(o2)) { System.out.println("o1 is equal with o2."); } if(o3.equals(o4)) { System.out.println("o3 is equal with o4."); } } }
答:上面程序的運行結果如下。
use Demo equals.
o3 is equal with o4.
因為 Demo 類中的 public boolean equals(Demo other) 方法並沒有重寫 Object 類中的 public boolean equals(Object obj) 方法,原因是其違背了參數規則,其中一個是 Demo 類型而另一個是 Object 類型,因此這兩個方法是重載關系(發生在編譯時)而不是重寫關系;故當調用 o1.equals(o2) 時,o2 是 Object 類型參數,實際上調用了 Object 類中的 public boolean equals(Object obj) 方法,因為在編譯時 o1 和 o2 都是 Object 類型,而 Object 類的 equals 方法是通過比較內存地址才返回 false;當調用 o3.equals(o4) 時,實際上調用了 Demo 類中的 equals(Demo other) 方法,因為在編譯時 o3 和 o4 都是 Demo 類型的,所以才有上面的打印。
Java 重載與重寫(9)