java多態


多態性

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM