多態是指當系統A訪問系統B的服務時,系統B可以通過多種方式來提供服務,而這一切對系統A是透明的.比如動物園的飼養員能夠給各種各樣的動物喂食.下圖顯示了飼養員Feeder,食物Food和動物Animal及它的子類的類框圖.

可以把Feeder,Animal和Food都看成獨立的子系統.Feeder類的定義如下:
public class Feeder{
public void feed(Animal animal,Food food){
animal.eat(food);
}
}
以下程序演示了一個飼養員分別給一只狗喂肉和貓喂魚.
Feeder feeder=new Feeder();
Animal animal=new Dog();
Food food=new Bone();
feeder.feed(animal,food);//給dog喂肉
animal=new Cat();
food=new Fish();
feeder.feed(animal,food);//給cat喂魚
以上animal變量被定義為Aniaml類型,但實際上有可能引用Dog或Cat的實咧.在Feeder類的feed()方法中調用animal.eat()方法,Java虛擬機會執行animal變量所引用的實咧的eat()方法.可見animal變量有多種狀態,一會兒是貓,一會兒是狗,這個就是多態的字母含義.
Java語音允許某個類型的引用變量引用子類的實咧,而且可以對這個引用變量進行類型轉換.
Animal animal=new Dog();
Dog dog=(Dog)animal;
Creature creature=animal;
如果把引用變量轉換為子類類型,則稱為向下轉型,如果把引用變量轉換為父類類型,則稱為向上轉型.在進行引用變量的轉換時,會受到各種靜態屬性,靜態方法,實烈方法,以及從父類中繼承的方法和屬性時,Java虛擬機會采用不同的綁定機制.
通過具體的例子來演示多態的各種特性.在下圖中父類Base和子類Sub中都定義了實例變量var,實例方法method(),靜態變量staticVar和靜態方法staticMethod(),此外,在Sub類中還定義了實例變量subVar和subMethod().

Sub.java:
package poly;
class Base{
String var="BaseVar";//實例變量
static String staticVar="StaticBaseVar";//靜態變量
void method(){ //實例方法
System.out.println("Base method");
}
static void staticMethod(){ //靜態方法
System.out.println("Static Base method");
}
}
public class Sub extends Base{
String var="SubVar"; //實例變量
static String staticVar="StaticSubVar'; // 靜態變量
void method(){ //覆蓋父類的method()方法
System.out.println("Sub method");
}
static void staticMethod(){ //隱藏父類的staticMethod()方法
Syatem.out.println("Static Sub method");
}
String subVar="Var only belonging to Sub";
void subMethod(){
System.out.println("Method only belonging to Sub");
}
public static void main(String args[]){
Base who=new Sub(); //who被聲明為Base類型,引用Sub實例
System.out.println("who.var="+who.var); //打印Base類的var變量
System.out.println("who.staticVar="+who.staticVar); //打印Base類的staticVar變量
who.method(); //打印Sub實例的method()方法
who.staticMethod(); //打印Base類的staticMethod()方法
}
}
今天先寫這么多,請多多指教.
