熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Java運行時多態性的實現

2013-11-23 18:58:55  來源: Java核心技術 

  運行時多態性是面向對象程序設計代碼重用的一個最強大機制動態性的概念也可以被說成一個接口多個方法Java實現運行時多態性的基礎是動態方法調度它是一種在運行時而不是在編譯期調用重載方法的機制下面就繼承和接口實現兩方面談談java運行時多態性的實現

  一通過繼承中超類對象引用變量引用子類對象來實現

  舉例說明

  //定義超類superA

  class superA

  {

  int i =

  void fun()

  {

  Systemoutprintln(This is superA

  }

  }

  //定義superA的子類subB

  class subB extends superA

  {

  int m =

  void fun()

  {

  Systemoutprintln(This is subB

  }

  }

  //定義superA的子類subC

  class subC extends superA

  {

  int n =

  void fun()

  {

  Systemoutprintln(This is subC

  }

  }

  class Test

  {

  public static void main(String[] args)

  {

  superA a

  subB b = new subB()

  subC c = new subC()

  a=b

  afun()         (

  a=c

  afun()         (

  }

  }

  運行結果為

  This is subB

  This is subC

  上述代碼中subB和subC是超類superA的子類我們在類Test中聲明了個引用變量a b c通過將子類對象引用賦值給超類對象引用變量來實現動態方法調用也許有人會問為什麼()和()不輸出This is superAjava 的這種機制遵循一個原則當超類對象引用變量引用子類對象時被引用對象的類型而不是引用變量的類型決定了調用誰的成員方法但是這個被調用的方法必須是在超類中定義過的也就是說被子類覆蓋的方法

  所以不要被上例中()和()所迷惑雖然寫成afun()但是由於()中的a被b賦值指向了子類subB的一個實例因而()所調用的fun()實際上是子類subB的成員方法fun()它覆蓋了超類superA的成員方法fun()同樣()調用的是子類subC的成員方法fun()

  另外如果子類繼承的超類是一個抽象類雖然抽象類不能通過new操作符實例化但是可以創建抽象類的對象引用指向子類對象以實現運行時多態性具體的實現方法同上例

  不過抽象類的子類必須覆蓋實現超類中的所有的抽象方法否則子類必須被abstract修飾符修飾當然也就不能被實例化了

  二通過接口類型變量引用實現接口的類的對象來實現

  接口的靈活性就在於規定一個類必須做什麼而不管你如何做我們可以定義一個接口類型的引用變量來引用實現接口的類的實例當這個引用調用方法時它會根據實際引用的類的實例來判斷具體調用哪個方法這和上述的超類對象引用訪問子類對象的機制相似

  舉例說明

  //定義接口InterA

  interface InterA

  {

  void fun()

  }

  //實現接口InterA的類B

  class B implements InterA

  {

  public void fun()

  {

  Systemoutprintln(This is B

  }

  }

  //實現接口InterA的類C

  class C implements InterA

  {

  public void fun()

  {

  Systemoutprintln(This is C

  }

  }

  class Test

  {

  public static void main(String[] args)

  {

  InterA a

  a= new B()

  afun()

  a = new C()

  afun()

  }

  }

  輸出結果為

  This is B

  This is C

  上例中類B和類C是實現接口InterA的兩個類分別實現了接口的方法fun()通過將類B和類C的實例賦給接口引用a而實現了方法在運行時的動態綁定充分利用了一個接口多個方法展示了Java的動態多態性

  需要注意的一點是Java在利用接口變量調用其實現類的對象的方法時該方法必須已經在接口中被聲明而且在接口的實現類中該實現方法的類型和參數必須與接口中所定義的精確匹配

  結束語以上就是java運行時多態性的實現方法大家在編程過程中可以靈活運用但是在性能要求較高的代碼中不提倡運用運行時多態畢竟Java的運行時動態方法調用較之普通的方法調用的系統開銷是比較大的


From:http://tw.wingwit.com/Article/program/Java/hx/201311/26085.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.