天天看點

向上轉型和向下轉型

轉型是在繼承的基礎上而言的。

向上轉型:子類引用的對象轉換為父類類型稱為向上轉型。

子類對象當成父類對象,隻能調用父類的成員,如果子類重寫了父類的方法就根據這個引用指向調用子類重寫的這個方法(這個方法就是覆寫override,這個調用過程就稱為“動态綁定”)。

向上轉型時,父類指向子類引用對象會遺失除與父類對象共有的其他方法,也就是在轉型過程中,子類的新有的方法都會遺失掉,在編譯時,系統會提供找不到方法的錯誤。

public class Animal {
         public void eat(){
                   System.out.println("animal eatting...");
         }
}
class Bird extends Animal{
         public void eat(){
                   System.out.println("bird eatting...");
         }
         public void fly(){
                   System.out.println("bird flying...");
         }
}
class Main{      
         public static void main(String[] args) {
                   Animal b=new Bird(); //向上轉型
                   b.eat();
         b.fly();  //此處提示在Animal中沒有定義fly方法。
}
           

向下轉型:父類引用的對象轉換為子類類型稱為向下轉型。

在向下轉型過程中,分為兩種情況:

情況一:如果父類引用的對象如果引用的是指向的子類對象,那麼在向下轉型的過程中是安全的。也就是編譯是不會出錯誤的。

情況二:如果父類引用的對象是父類本身,那麼在向下轉型的過程中是不安全的,編譯不會出錯,但是運作時會出現java.lang.ClassCastException錯誤。它可以使用instanceof來避免出錯此類錯誤。

public class Girl {
         public void smile(){
                   System.out.println("girl smile()...");
         }
}
class MMGirl extends Girl{
         @Override
         public void smile() {
         System.out.println("MMirl smile sounds sweet...");
         }
         public void c(){
          System.out.println("MMirl c()...");
         }
}
class main{
      public static void main(String[] args) {
        Girl g1=new MMGirl(); //向上轉型
        g1.smile();
        MMGirl mmg=(MMGirl)g1;    //向下轉型,編譯和運作皆不會出錯
        mmg.smile();
        mmg.c();
        Girl g2=new Girl();
        //MMGirl mmg1=(MMGirl)g2; //不安全的向下轉型,編譯無錯但會運作會出錯
//mmg1.smile();
        //mmg1.c();
       if(g2 instanceof MMGirl){
         MMGirl mmg1=(MMGirl)g2;
         mmg1.smile();
         mmg1.c();
         }}