java的編譯時多態和運行時多態


1、運行時多態和編譯時多態的區別?
編譯時的多態,是指參數列表的不同, 來區分不同的函數, 在編譯后, 就自動變成兩個不同的函數名. 在運行時談不上多態
運行時多態:用到的是后期綁定的技術, 在程序運行前不知道,會調用那個方法, 而到運行時, 通過運算程序,動態的算出被調用的地址. 動態調用在繼承的時候,方法名 參數列表完全相同時才出現運行時多態!
運行時多態,也就是動態綁定,是指在執行期間(而非編譯期間)判斷所引用對象的實際類型,根據實際類型判斷並調用相應的屬性和方法.看看下面這個例子:
abstract class Animal {
  private String name;
  Animal(String name) {this.name = name;}
  /*
  public void enjoy(){
    System.out.println("叫聲......");//父類方法,下面的子類對該方法不滿意,重寫.
  }
  */
  public abstract void enjoy();//該方法沒有實現的必要(所以我們一般聲明為靜態方法),但有定義的必要.
}

class Cat extends Animal {
  private String eyesColor;
  Cat(String n,String c) {super(n); eyesColor = c;}

  public void enjoy() {
    System.out.println("貓叫聲......");
  }
 
  //public abstract void enjoy();//如果不想實現父類靜態方法,可將此方法聲明為靜態的,該類也同時為abstract
}

class Dog extends Animal {
  private String furColor;
  Dog(String n,String c) {super(n); furColor = c;}

  public void enjoy() {
    System.out.println("狗叫聲......");
  }
}

class Bird extends Animal {
         Bird() {
                  super("bird");
         }
         public void enjoy() {
    System.out.println("鳥叫聲......");
  }
}

class Lady {
    private String name;
    private Animal pet;
    Lady(String name,Animal pet) {
        this.name = name; this.pet = pet;
    }
    public void myPetEnjoy(){pet.enjoy();}
}

public class Test {
    public static void main(String args[]){
        Cat c = new Cat("catname","blue");
        Dog d = new Dog("dogname","black");
        Bird b = new Bird();
        //Lady l1 = new Lady("l1",c);
        Lady l2 = new Lady("l2",d);
        Lady l3 = new Lady("l3",b);
       //l1.myPetEnjoy();
        l2.myPetEnjoy();
        l3.myPetEnjoy();
    }
}
動態綁定的底層實現是指針,我們知道程序中的方法是一段代碼,存放在專門的內存區域中(code segment---代碼區),當我們在程序執行期間new 出一個對象后調用enjoy方法的時候,JVM動態的把指針指向實際的對象重寫的方法,從而實現了動態綁定.
動態綁定的最大好處就是給我們的程序的可擴展性帶來了相當大的提高(上面的例子中我們可以繼續添加子類或是在main方法中new  lady,),如果沒有動態綁定,我們一般情況下的做法是在子類中用instanceof判斷一個對象是不是我們需要的當前具體對象,但當我們定義好多個子類的時候,每次都要判斷,現在有了動態綁定,我們不需要再去判斷,而是JVM動態給我們指向具體的對象並調用相應的屬性和方法.

 


本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/tophot115/archive/2008/10/04/3016033.aspx


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: