Java 高階特性之 instanceof

lvzhou_MadSky發表於2013-06-05

Java中的instanceof關鍵字

instanceof是Java的一個二元操作符,和==,>,<是同一類東東。由於它是由字母組成的,所以也是Java的保留關鍵字。它的作用是測試它左邊的物件是否是它右邊的類的例項,返回boolean型別的資料。舉個例子:

  String s = "I AM an Object!";
  boolean isObject = s instanceof Object;

  我們宣告瞭一個String物件引用,指向一個String物件,然後用instancof來測試它所指向的物件是否是Object類的一個例項,顯然,這是真的,所以返回true,也就是isObject的值為True。
  instanceof有一些用處。比如我們寫了一個處理賬單的系統,其中有這樣三個類:

  public class Bill {//省略細節}
  public class PhoneBill extends Bill {//省略細節}
  public class GasBill extends Bill {//省略細節}

  在處理程式裡有一個方法,接受一個Bill型別的物件,計算金額。假設兩種賬單計算方法不同,而傳入的Bill物件可能是兩種中的任何一種,所以要用instanceof來判斷:

  public double calculate(Bill bill) {
  if (bill instanceof PhoneBill) {
  //計算電話賬單
  }
  if (bill instanceof GasBill) {
  //計算燃氣賬單
  }
  ...
  }
  這樣就可以用一個方法處理兩種子類。

  然而,這種做法通常被認為是沒有好好利用物件導向中的多型性。其實上面的功能要求用方法過載完全可以實現,這是物件導向變成應有的做法,避免回到結構化程式設計模式。只要提供兩個名字和返回值都相同,接受引數型別不同的方法就可以了:

  public double calculate(PhoneBill bill) {
  //計算電話賬單
  }

  public double calculate(GasBill bill) {
  //計算燃氣賬單
  }

  所以,使用instanceof在絕大多數情況下並不是推薦的做法,應當好好利用多型。

相關文章