天天看點

前期綁定與後期綁定

文章目錄

    • 概念
    • 舉例說明

概念

  • 綁定:一個方法的調用與方法的所在類【方法主體】關聯起來
  • 前期綁定:final、static、private、構造方法、成員變量【包括靜态及非靜态】
  • 後期綁定:除了前期綁定之外的其他方法屬于後期綁定,運作時能判斷對象的類型進行綁定

注:為了執行後期綁定,Java 使用一小段特殊的代碼來替代絕對位址調用,這段代碼使用在對象中存儲的資訊來計算方法體的位址(過程在以後詳述),這樣,根據這一小段代碼的内容,每一個對象都可以具有不同的行為表現。是以,當向一個對象發送消息時,該對象就能知道對這條消息應該做些什麼

舉例說明

  • Person【人類】
/**
 * 描述:人類
 */
class Person{

    protected String UNIQUE_FLAG = "Person";

    /** 心 **/
    private Heart heart;

    public Person(){
        System.out.println("Person created......");
    };

    public Person(String id,String name){
        super(id,name);
    }

    public Person(String name){
        super(name);
    }

    public Heart getHeart() {
        return heart;
    }

    public void setHeart(Heart heart) {
        this.heart = heart;
    }

    /**
     * 描述:購買
     * @param <E>
     * @return
     */
    public static <E> List<E> buy(E arg,int num){
        return MagicStore.get(arg,num);
    }

    public static void birth(){
        System.out.println("降臨人世間......");
    }

    public static void die(){
        System.out.println("走向人間天堂......");
    }

    public void breath(){
        System.out.println("Person" + "呼吸......");
    }
}
           
  • Boy【男孩】
/**
 * 描述:男孩
 */
class Boy extends Person{

    protected String UNIQUE_FLAG = "Boy";

    /** 男孩的心 **/
    private Heart heart;

    public Boy(){
        System.out.println("Boy created......");
    }

    public Boy(String name){
        super(name);
    }

    Boy(String id,String name){
        super(id, name);
    }

    public static void birth(){
        System.out.println("Boy" + "降臨人世間......");
    }

    public static void die(){
        System.out.println("Boy" + "走向人間天堂......");
    }

    @Override
    public void breath(){
        System.out.println("Boy" + "呼吸......");
    }
}

           
  • 測試類
public class AyTest {

    public static void main(String[] args){

        // 男孩産生,用 Person 引用,列印 1 和 2 結果
        Person boy = new Boy();
        // 男孩出生,由于 birth 是靜态方法,是前期綁定,是以調用 person 的 birth 方法
        boy.birth();
        // final 常量也是前期綁定,是以調用父類 Person 的 UNIQUE_FLAG 常量
        System.out.println(boy.UNIQUE_FLAG);
        // breath 是後期綁定,是以調用 boy 的 breath 方法
        boy.breath();
        // 編譯報錯,通路權限的原因
        boy.heart;
    }

}
           
  • 列印結果
Person created......  1
Boy created......     2
降臨人世間......       3
Person                4
Boy呼吸......         5