多型一

Diy_os發表於2015-10-27
前面的文章簡單的分析了動態繫結機制,http://blog.itpub.net/29876893/viewspace-1816523/,但是也許有很多疑問,下面介紹下子類如何呼叫自己的方法或我們阻止多型。
修改的程式碼如下:

點選(此處)摺疊或開啟

  1. public class Animal {
  2.     
  3.     public String name;
  4.     
  5.     Animal(String name){
  6.         
  7.         this.name = name;
  8.     }
  9.    
  10.     public void enjoy(){
  11.         
  12.         System.out.println("叫聲...");
  13.     }

  14. }

  15. public class Cat extends Animal {
  16.     
  17.     private String eyesColor;
  18.     
  19.     Cat(String n,String c){
  20.             
  21.             super(n);
  22.             eyesColor = c;
  23.         }
  24.     
  25.      public void enjoy(){
  26.         
  27.          System.out.println("貓叫聲...");
  28.      }
  29.     
  30.      public void catcolor(){
  31.         
  32.          System.out.println(eyesColor);
  33.      }
  34.     }


  35. public class Dog extends Animal{
  36.   
  37.     private String furColor;
  38.     
  39.     Dog(String n,String c){
  40.         
  41.         super(n);
  42.         furColor = c;
  43.     }
  44.     
  45.     public void enjoy(){
  46.         
  47.         System.out.println("狗叫聲。。。");
  48.     }
  49.     
  50.     public void dogfurcolor(){
  51.         
  52.         System.out.println(furColor);
  53.     }
  54. }


  55. public class Test {
  56.    
  57.      public void cataddr(Animal per){
  58.     
  59.       System.out.print(per.name + " ");
  60.     
  61.      if(per instanceof Cat){
  62.         
  63.         Cat cat = (Cat)per;
  64.         
  65.         cat.catcolor();;
  66.         
  67.     }else if(per instanceof Dog){
  68.         
  69.         Dog dog = (Dog)per;
  70.         
  71.          dog.dogfurcolor();
  72.     }
  73.     else{
  74.         
  75.         System.out.println("空值");
  76.     }
  77. }

  78.     public static void main(String[] args){
  79.         
  80.         Test w = new Test();
  81.         Cat c = new Cat("catname", "bule");
  82.         Dog d = new Dog("dogname", "black");
  83.         w.cataddr(c);
  84.         w.cataddr(d);
  85.      
  86.     }
  87. }






上面在Cat,Dog中新增了新的方法,如果用Animal的引用呼叫這些方法,編譯器會提錯,那如果真想呼叫基類的自定義的方法,則需要強制轉換,把Animal 引用強制轉換成Cat,Dog型別,為了防止出現異常,我們用instanceof來檢查,返回布林型別,具體用法:


boolean result = object instanceof class
Result:布林型別。
Object:必選項。任意物件表示式。
class:必選項。任意已定義的物件類。
如果 object 是 class 的一個例項,則 instanceof 運算子返回 true。如果 object 不是指定類的一個例項,或者 object 是 null,則返回 false。


我們透過instanceof的檢查後,基類可以呼叫自定義的方法


如果把父類中的enjoy()定義為static,private,final,那麼就不會出現多型性,方法被定義指定為private隱式的定義為final,類的設計者不希望該方法被繼承修改。被指明為static時,那麼這個方法就是類的通性,不會隨物件的改變而發生變化,那麼也失去了多型。關於這方面,讀者可以參考<>第八章和<>第五章,有很詳細的介紹。
下面給出一個小例子:


點選(此處)摺疊或開啟

  1. class t {
  2.    
  3.   private void f(){
  4.     
  5.      System.out.println("diyjie");
  6.   }
  7.   public static void main(String[] args){
  8.     
  9.      t w = new t1();
  10.      w.f();
  11.  }
  12. }

  13. public class t1 extends t{
  14.     
  15.     public void f(){
  16.         
  17.         System.out.println("os");
  18.     }
  19.     
  20. }

我們想出現的結果是os,但是結果是lios,因為父類中的f()方法在子類中不可見,不會出現多型機制,如果清楚多型機制的話,我想原因一目瞭然。

修改上述程式碼:

點選(此處)摺疊或開啟

  1. class t {
  2.    
  3.   public int i = 0;
  4.   
  5.   public void f(){
  6.     
  7.      System.out.println("lios");
  8.   }
  9. }

  10. public class t1 extends t{
  11.     
  12.     public int i =1;
  13.     
  14.     public void geti(){
  15.         
  16.         System.out.print(super.i);
  17.     }
  18.     public void f(){
  19.         
  20.         System.out.println("os");
  21.     }
  22.     
  23.     public static void main(String[] args){
  24.         
  25.         t w = new t1();
  26.         System.out.print(w.i + " ");
  27.         w.f();
  28.         
  29.         t1 w1 = new t1();
  30.         System.out.print(w1.i +" "+"super.i=");
  31.         w1.geti();
  32.         
  33.     }
  34.     
  35. }
輸出結果:
0 os
1 super.i=0
可能對於為什麼列印w.i為0,因為在在new子類物件時,堆內分配兩個不同地址的i,一個是從父類繼承的i,一個是基類中的i,此時父類的引用只指向自己的物件中的成員變數,所以結果如上。其他的都很簡單。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29876893/viewspace-1816807/,如需轉載,請註明出處,否則將追究法律責任。