首先要明白一點Java中的向上轉型和向下轉型他們都是建立在繼承的基礎上。
一.向上轉型
子類到父類的轉換通常稱作向上轉型,通俗的說就是定義父類對象指向子類對象。
下面通過一個例子來深入理解向上轉型.
//定義一個抽象的動物父類
public abstract class Animal
{
public abstract void Play();//此處需注意抽象方法沒有方法體
}
//定義一個狗狗類,繼承自Animal
public class Dog extends Animal
{
//重寫父類的Play方法
public void Play()
{
System.out.println("狗狗正在歡快的玩耍。。。。。");
}
//子類還有自己特有的eat方法
public void eat()
{
System.out.println("狗狗正在歡快的吃著。。。。。");
}
}
//測試類
public void Test
{
public static void main(String[] args) {
Animal animal=new Dog();//向上轉型,父類對象指向子類對象
animal.Play();//能正常編譯
animal.eat();//編譯不通過,父類的引用無法調用子類特有的方法
}
}
從上面這個例子可以總結出自樂裝換成父類時的規則:
01.將一個父類的引用指向一個子類對象,稱為向上轉型,自動進行類型轉換。
02.通過父類引用變量調用的是子類覆蓋或繼承父類的方法,不是父類的方法。
03.通過父類引用變量無法調用子類特有的方法。
二.向下轉型
上面已經說到,當向上轉型發生後,將無法調用子類特有的方法。但是當需要調用子類特有的方法時,可以通過將父類在轉換為子類來實現。
向下轉型:將一個指向子類對象的父類引用賦給一個子類的引用,稱為向下轉型。注意:必須進行強制類型轉換。
//定義一個抽象的動物父類
public abstract class Animal
{
public abstract void Play();//此處需注意抽象方法沒有方法體
}
//定義一個狗狗類,繼承自Animal
public class Dog extends Animal
{
}
//定義貓類,繼承自Animal
public class Cat extends Animal
{
}
public class Test
{
Animal animal=new Dog();
Dog dog=(Dog)animal;//向下轉型,強制轉換為狗狗對象
Cat cat=(Cat)animal;//運行出錯
}
向下轉型:轉型時轉的類型必須是父類對象所指的真實子類對象,不是任意的強制類型轉換。
最後總結一下吧!
1、父類引用可以指向子類對象,子類引用不能指向父類對象。
2、把子類對象直接賦給父類引用叫向上轉型,向上轉型不用強制轉型。
3、把指向子類對象的父類引用賦給子類引用叫向下轉型,要強制轉型。
4、向上轉型會丟失子類特有的方法,但是子類overriding 父類的方法,子類方法有效
5、向上轉型的作用,減少重復代碼,父類做為參數,調用時子類作為參數,就是利用了向上轉型。這樣使代碼變得簡潔。體現了JAVA的抽象面向對象編程。