Java 多態總結

子類繼承父類,子類是父類的擴展,子類得到父類的所有成員變量和方法,也就是說子類的實例擁有父類實例的共同特徵,子類是特殊的父類,所以子類實例可以賦值給父類的引用變量,稱爲向上轉型。

多態:編譯時類型和運行時類型不一樣,同一個類型的引用變量調用相同的方法時,可能會出現不同的結果。引用變量只能調用引用變量所屬類中定義的方法和實例變量。方法具有多態性,而子類實例變量名和父類實例變量名相同時,父類實例變量只是被隱藏,並沒有被重寫,所以實例變量不具多態性。
代碼演示:
class Father{
     int a=10;
     public void father(){
          System. out.println("父類的方法" );
     }
}
public class Son extends Father{
     //子類隱藏父類的實例變量
     int a=100;
     public void father(){
          System. out.println("子類覆蓋父類的方法" );
     }
     public void son(){
          System. out.println("子類自己的方法" );
     }
    public static void main(String args[]){
     Father f=new Son();
     //引用變量類型變量只能調用所屬類中定義的方法,如果方法被重寫,調用的是被重寫的方法
     f.father();
     //引用變量類型變量不能調用不是所屬類定義的方法
     //f.son();
     //實例變量不具有多態性
     System.out.println(f. a);
    }
}

如果需要父類引用類型變量調用子類中定義的方法,可以將父類引用變量進行強制類型轉換,轉換爲子類類型的變量。父類引用類型變量強制轉換爲子類類型的變量,需要父類引用類型變量指向的是子類的實例。(引用類型強制轉換需要是具有父子關係的兩個類型之間)

爲保證強制轉換不會出現異常,進行強制轉換前先用instanceof運算符判斷是否可以成功轉換,instanceof運算符前一個操作數是引用類型變量,或一個操作數是類或接口。instanceof運算符用來判斷前面引用類型變量指向的實例,是否是後面類,或子類、接口的實例,如果是返回true(可成功強制轉換),不是返回false(不可成功強制轉換)。
代碼演示:將上面代碼的主方法改爲:
 
public static void main(String args[]){
     Father f=new Son();
     //如果返回true,則會成功轉換
     if(f instanceof Son){
          Son s=(Son)f;
          s.son();
     }

通過instanceof判斷是否可以強制轉換成功。
       
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章