多態性
java引用類型有兩個:
編譯時類型
編譯時類型由聲明該變量時使用的類型決定
運行時類型
運行時類型由實際賦給該變量的對象決定
例:
1 class Animal{ 2 public int month = 2; 3 public void eat(){ 4 System.out.println("動物吃東西"); 5 } 6 7 } 8 9 class Dog extends Animal{ 10 public int month = 3; 11 12 public void eat() { 13 System.out.println("小狗吃肉"); 14 } 15 16 public void sleep() { 17 System.out.println("小狗睡午覺"); 18 } 19 } 20 21 class Cat extends Animal{ 22 public int month = 4; 23 24 public void eat() { 25 System.out.println("小貓吃魚"); 26 } 27 } 28 29 public class Test { 30 public static void main(String[] args){ 31 Animal a = new Dog(); 32 Animal b = new Cat(); 33 a.eat(); 34 System.out.println(a.month); 35 //下面代碼編譯時會出錯 36 // a.sleep(); 37 b.eat(); 38 System.out.println(b.month); 39 40 } 41 }
a對象編譯時類型是Animal,運行時類型是Dog;
b對象編譯時類型是Animal,運行時類型是Cat。
當運行時調用引用變量的方法時,其方法行為總是表現出子類方法的行為特征,而不是父類方法的行為特征,這就表現出:相同類型的變量調用同一個方法時表現出不同的行為特征,這就是多態。
該例中:當他們調用eat方法時,實際調用的是父類Animal中被覆蓋的eat方法。
運行結果:
小狗吃肉 2 小貓吃魚 2
上例中main方法中注釋了a.sleep(),由於a的編譯時類型為Animal,而Animal類中沒有sleep方法,因此無法在編譯時調用sleep方法。
對象的實例變量不具備多態性
上例中a,b對象分別調用了month,可以看到,其輸出結果都是2
總的來說:
引用變量在編譯階段只能調用編譯時類型所具有的方法,但運行時則執行他運行時類型所具有的方法。
更多見 :www.zhanzhimin.cn