1. 程式人生 > 其它 >物件的向上轉型和向下的轉型

物件的向上轉型和向下的轉型

1.物件的向上轉型,其實就是多型寫法:

格式:父類名稱 物件名=new 子類名稱();

  Animal animal=new Cat();  //建立了一隻貓,當做動物看待,沒問題。

含義:右側建立一個子類物件,把它當做父類來看待使用。

注意事項:向上轉型一定是安全的。從小範圍轉向了大範圍,從小範圍的貓,向上轉型成為更大範圍的動物。

類似於:double num=100;//正確,int----->double,自動型別轉換。

2.物件的向下轉型,其實是一個【還原】的動作。

格式:子類名稱 物件名=(子類名稱)父類物件;

含義:將父類物件,【還原】成為本來的子類物件。

Animal animal=new Cat();  //本來是貓,向上轉型成為動物

Cat cat=(Cat) animal;//本來是貓,已經被當做動物了,還原回來成為本來的貓。

注意事項:

a.必須保證物件本來建立的時候,就是貓,才能向下轉型成為貓。

b.如果物件建立的時候本來不是貓,現在非要向下轉型成為貓,就會報錯。ClassCastException

類似於:  int num=(int) 10.0;//可以    int num=(int) 10.0小;//不可以,精度損失

public abstract class Animal {
public abstract void eat();
}
==============================
public class Cat extends Animal {
@Override
public void eat() {
System.out.println("貓吃魚");
}

//子類特有方法
public void CatchMouse(){
System.out.println("貓抓老鼠");
}
}
=================================
/*
向上轉型一定是安全的,沒有問題的,正確的。但是也有一個弊端:
物件一旦向上轉型為父類,那麼就無法呼叫子類原本特有的內容。

解決方案:用物件的向下轉型【還原】。
*/
public class Demo01Main {
public static void main(String[] args) {
//物件的向上轉型,就是:父類引用指向子類物件
Animal animal=new Cat();//本來建立的時候是一隻貓
animal.eat();//貓吃魚

// animal.CatchMouse();//錯誤寫法!

//向下轉型,進行“還原”動作
Cat cat=(Cat) animal;
cat.CatchMouse();//貓抓老鼠

//下面是錯誤的向下轉型
//本來new的時候是一隻貓,現在非要當做狗。
//錯誤寫法!編譯不會報錯,但是執行會出現異常:
//java.lang.ClassCastException,類轉換異常
Dog dog=(Dog) animal;
}
}
=============================================
public class Dog extends Animal {

@Override
public void eat() {
System.out.println("狗吃骨頭");
}

public void watchHouse(){
System.out.println("狗看家");
}
}