java基礎:多型(動態繫結)

十五樓亮哥發表於2015-02-01

一、例子

public class Animal {
	private String name;
	
	public void enjoy(){
		System.out.println("---叫聲---");
	}
	
	public Animal(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	

}


public class Dog extends Animal{
	private String furColor;
	public Dog(String name,String furColor) {
		super(name);
		this.furColor = furColor;
	}
	public void enjoy(){
		System.out.println("---狗叫聲---");
	}

	public String getFurColor() {
		return furColor;
	}

	public void setFurColor(String furColor) {
		this.furColor = furColor;
	}
	

}


public 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 String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Animal getPet() {
		return pet;
	}
	public void setPet(Animal pet) {
		this.pet = pet;
	}

}


public class Test {
	public static void main(String[] args) {
		Dog d = new Dog("Hachi","yellow");
		Lady l1  = new Lady("lili",d);
		l1.myPetEnjoy();
	}

}

執行結果:

---狗叫聲---


二:分析

Dog d = new Dog("Hachi","yellow");
Lady l1  = new Lady("lili",d);
l1.myPetEnjoy();

呼叫Lady的myPetEnjoy()方法。這裡有兩個enjoy()方法,一個是父類Animal的,一個是Dog的。

那麼真正呼叫誰的呢?這裡有一個規則,new Lady("lili",d);堆記憶體中,真正的是誰,就呼叫誰的方法,而不是由引用Animal pet 決定的。這就是動態繫結(在java執行期,動的時候,才會去繫結。)




動態繫結的優點,可以隨時擴充套件功能,比如Lady想養一隻貓,只需要按照Dog的形式,建立一隻貓。

Cat  c = newCat ("mimi","yellow");
Lady l1  = new Lady("lili",c);
l1.myPetEnjoy();

Lady內部的程式碼,完全不用動就可以了,這是物件導向一個很重要的特性。


三:總結

   多型實現的條件

(1)要有繼承

(2)要有重寫

(3)父類引用指向子類物件



相關文章