1. 程式人生 > >Java 過載與重寫面試基礎題

Java 過載與重寫面試基礎題

問:簡單說說 Java 過載與重寫是什麼?有什麼區別?

答:過載(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 型別的,所以才有上面的列印。