常見Java面試題:重載(overloading)與重寫(overriding)

來源:互聯網
上載者:User

ImportNew註: 本文是ImportNew編譯整理的Java面試題系列文章之一。你可以從這裡查看全部的Java面試系列。

這篇文章介紹的常見面試題是關於重載(overloading)方法和重寫(overriding)方法的。

Q.下面程式碼片段的輸出結果是什嗎?

View Code

 1 public class MethodOverrideVsOverload { 2   3  public boolean equals( MethodOverrideVsOverload other ) { 4      System.out.println("MethodOverrideVsOverload equals method reached" ); 5      return true; 6    } 7   8  public static void main(String[] args) { 9   Object o1 = new MethodOverrideVsOverload();10   Object o2 = new MethodOverrideVsOverload();11  12   MethodOverrideVsOverload o3 = new MethodOverrideVsOverload();13   MethodOverrideVsOverload o4 = new MethodOverrideVsOverload();14  15   if(o1.equals(o2)){16    System.out.println("objects o1 and o2 are equal");17   }18  19   if(o3.equals(o4)){20    System.out.println("objects o3 and o4 are equal");21   }22  }23 }

A.輸出結果是:

MethodOverrideVsOverload equals method reached

objects o3 and o4 are equal

這個問題考察了哪些概念呢?

  • Java語言中,一個類只能從一個類中繼承出來(也就是,單繼承結構),如果沒有顯式的標明所繼承自的類,那麼自動繼承自Object對象。
  • 大多數的非final對象類方法都會被子類重寫(overridden):

public boolean equals(Object obj); // make note of this method

public int hashCode();

public String toString();

  • 重載方法在編譯時間起作用(例如,靜態繫結),重寫方法在運行時起作用(例如,動態綁定)。靜態繫結意味著JVM在編譯時間決定調用的類或方法。而動態綁定時,JVM是在運行時決定調用的類或方法。動態綁定設計是多態的基礎。更多瞭解編譯時間和運行時.
  • 子類中重寫父類的對應方法必須遵循下面的規則:
參數 不可變(譯者註:包括參數類型和個數)。
傳回型別 不可變,除了協變傳回型別或其子類型(covariant (subtype) returns)。
異常 子類中可以拋出更少的異常,但絕對不能拋出父類中沒有定義的已檢查異常。
存取權限 比父類中對應方法更寬鬆。
調用 運行時(也就是動態綁定),根據物件類型來決定調用的具體方法。

現在,再回頭看上面的代碼,MethodOverrideVsOverload 類中的”equals(MethodOverrideVsOverload other)” 方法並沒有重寫Object類中的”public boolean equals(Object obj)” 方法。這是因為其違背了參數規則,其中一個是MethodOverrideVsOverload 類型,而另一個是Object類型。因此,這兩個方法是重載關係發生在編譯時間),而不是重寫關係

因此,當調用o1.equals(o2)時,實際上調用了object類中的public boolean equals(Object obj)方法。這是因為在編譯時間,o1和o2都是Object類型,而Object類的equals( … )方法是比較記憶體位址(例如,Object@235f56和Object@653af32)的,因此會返回false。

當調用o3.equals(o4)時,實際上調用了MethodOverrideVsOverload 類中的equals( MethodOverrideVsOverload other )方法。這是因為在編譯時間,o3和o4都是MethodOverrideVsOverload類型的,因此得到上述結果。

接下來還可以怎麼提問呢?

Q.那怎麼解決上面的那個問題呢?

A.在Java5中,新增了註解,其中包括很好用的編譯時間註解(compile time annotations)@override,來保證方法正確的重寫了父類方法。如果在上面的代碼中添加了註解,那麼JVM會拋出一個編譯錯誤。

因此,解決的方法就是給MethodOverrideVsOverload  類的boolean equals( MethodOverrideVsOverload other )方法添加@override註解。這樣的話編譯時間就會有錯誤拋出來提示開發人員某個方法沒有正確的重寫父類方法。之後,還需要修改方法的參數,將其從 Object變成MethodOverrideVsOverload,具體如下:

View Code

 1 public class MethodOverrideVsOverload { 2   3  @Override 4  public boolean equals( Object other ) { 5      System.out.println("MethodOverrideVsOverload equals method reached" ); 6      return true; 7  } 8   9  public static void main(String[] args) {10   Object o1 = new MethodOverrideVsOverload(); //during compile time o1 is of type Object11                                               //during runtime o1 is of type MethodOverrideVsOverload12   Object o2 = new MethodOverrideVsOverload(); //during compile time o2 is of type Object13                                               //during runtime o2 is of type MethodOverrideVsOverload14  15   MethodOverrideVsOverload o3 = new MethodOverrideVsOverload(); //o3 is of type MethodOverrideVsOverload16                                                                 // during both compile time and runtime17   MethodOverrideVsOverload o4 = new MethodOverrideVsOverload(); //o4 is of type MethodOverrideVsOverload18                                                                 // during both compile time and runtime19  20   if(o1.equals(o2)){21    System.out.println("objects o1 and o2 are equal");22   }23  24   if(o3.equals(o4)){25    System.out.println("objects o3 and o4 are equal");26   }27  28  }29  30 }

輸出為:

MethodOverrideVsOverload equals method reached

objects o1 and o2 are equal

MethodOverrideVsOverload equals method reached

objects o3 and o4 are equal

上面的代碼中,運行時equals方法正確的重寫了Object中的相應方法。這是一個比較容易混淆的問題,面試的時候需要很詳盡的解釋相關的概念。

英文原文: Java Success,編譯:ImportNew - 鄭雯

譯文連結:http://www.importnew.com/2228.html

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.