父子對象之間的轉換分為了向上轉型和向下轉型,它們區別如下:
- 向上轉型 : 通過子類對象(小范圍)實例化父類對象(大范圍),這種屬於自動轉換
- 向下轉型 : 通過父類對象(大范圍)實例化子類對象(小范圍),這種屬於強制轉換
1. 向上轉型
示例1-向上轉型
class A { public void print() { System.out.println("A:print"); } } class B extends A { public void print() { System.out.println("B:print"); } } public class Test{ public static void main(String args[]) { A a = new B(); //通過子類去實例化父類
a.print(); } }
運行打印:
如上圖所示,可以看到打印的是class B的print,這是因為我們通過子類B去實例化的,所以父類A的print方法已經被子類B的print方法覆蓋了.從而打印classB的print.
類似於C++的virtual虛函數。
這樣做的意義在於:
- 當我們需要多個同父的對象調用某個方法時,通過向上轉換后,則可以確定參數的統一.方便程序設計(參考下面示例)
示例2-向上轉型的作用分析
class A { public void print() { System.out.println("A:print"); } } class B extends A { public void print() { System.out.println("B:print"); } } class C extends B { public void print() { System.out.println("C:print"); } } public class Test{ public static void func(A a) { a.print(); } public static void main(String args[]) { func(new B()); //等價於 A a =new B(); func(new C()); //等價於 C c =new C(); } }
運行打印:
PS:向上轉型時,父類只能調用父類方法或者子類覆寫后的方法,而子類中的單獨方法則是無法調用的.
2. 向下轉型
在java中,向下轉型則是為了,通過父類強制轉換為子類,從而來調用子類獨有的方法(向下轉型,在工程中很少用到).
為了保證向下轉型的順利完成,在java中提供了一個關鍵字:instanceof,通過instanceof可以判斷某對象是否是某類的實例,如果是則返回true,否則為false,instanceof使用如下:
A a = new B(); //向上轉型 (B類是A的子類)
a instanceof A; //返回true. a instanceof B; //返回true a instanceof C; //返回false
接下來,我們便來分析向下轉型的意義.
示例-向下轉型的作用分析
class A { public void print() { System.out.println("A:print"); } } class B extends A { public void print() { System.out.println("B:print"); } public void funcB(){ System.out.println("funcB"); } } class C extends A { public void print() { System.out.println("C:print"); } public void funcC(){ System.out.println("funcC"); } } public class Test{ public static void func(A a) { a.print(); if(a instanceof B) { B b = (B)a; //向下轉型,通過父類實例化子類 b.funcB(); //調用B類獨有的方法 } else if(a instanceof C) { C c = (C)a; //向下轉型,通過父類實例化子類 c.funcC(); //調用C類獨有的方法 } } public static void main(String args[]) { func(new A()); func(new B()); func(new C()); } }
運行打印:
從上面打印可以看到,我們成功通過向下轉型來調用B類和C類獨有的方法.
下章學習: 9.JAVA-抽象類定義