第14節 - Type Casting, Upcasting & Downcasting
這一節我會介紹Type Casting,Type Casting包括Upcasting和Downcasting兩種。
因為Java是一種物件導向程式語言,只要一個子類別(Child)繼承(extends)父類別(Parent),父類別和子類別就有一個Casting的關係。
如果父類別的參考變數(reference variable)不是指向自己的物件,而是指向子類別的物件,這就叫做Upcasting。由於子類別可以視為和父類別相容,UpCasting是沒有問題的。
如果子類別的參考變數(reference variable)不是指向自己的物件,而是指向父類別的物件,這就叫做Downcasting。但在downcasting的情況下, 父類別的reference和子類別並不相容,因此必須使用Casting語法來做強迫轉換。
如下圖:

為甚麼要學Type Casting?
因為Java是一種物件導向程式語言,而Type Casting是物件導向程式語言的一種重要概念,我們必須學習。
但最主要原因是在介紹第17節 - LibGDX: Splash Screen之前,我們要明白Java的Type Casting,這是製作LibGDX的Splash Screen時,其中一個方法須要用到Type Casting的概念。
例子1


- 建立一個Class A。
- 建立一個Class B,然後繼承(extends)Class A。
- 建立一個Class A的Reference Variable a,然後執行a.methodA()方法。
建立一個Class B的Reference Variable b,然後執行b.methodB()方法。 - 執行Run。
例子2


- 建立一個Class A。
- 建立一個Class B,然後繼承(extends)Class A。
- 建立一個Class A的Reference Variable a,然後執行a.methodA()方法。
建立一個Class B的Reference Variable b,然後執行b.methodB()方法。
建立一個Class B的Reference Variable b,然後執行b.methodA()方法。
- 執行Run。
注意,由於子類別(B)可以視為和父類別(A)相容,所以執行b.methodA()方法是可以的。
例子3 - 多型(Polymorphism) - Method Overriding


- 建立一個Class A。
- 建立一個Class B,然後繼承(extends)Class A。
- 在Class B內建立一個methodA()方法。
建立一個Class A的Reference Variable a,然後執行a.methodA()方法。
建立一個Class B的Reference Variable b,然後執行b.methodB()方法。
建立一個Class B的Reference Variable b,然後執行b.methodA()方法。
- 執行Run。
注意,執行b.methodA()方法時,程式會選擇Class B內的methodA()方法,這就叫做Polymorphism - Method Overriding。
例子4 - 多型(Polymorphism) - Dynamic Method Dispatch


- 建立一個Class A。
- 建立一個Class B,然後繼承(extends)Class A。
- 建立一個Class A的Reference Variable a,然後把a指向物件b,再執行a.methodA()方法。
- 執行Run。
注意,執行a.methodA()方法時,程式會在執行程式時(則動態-Dynamic)選擇Class B內的methodA()方法,這就叫做Polymorphism - Dynamic Method Dispatch。
例子5


- 建立一個Class A。
- 建立一個Class B,然後繼承(extends)Class A。
- 建立一個Class A的Reference Variable a,然後執行a.methodB()方法。
建立一個Class B的Reference Variable b,然後執行b.methodB()方法。
建立一個Class B的Reference Variable b,然後執行a.methodB()方法。
- 執行Run。
注意,由於父類別(A)的reference和子類別(B)並不相容,所以執行a.methodB()方法是不可以的。
例子6 - Casting
要解決例子5不相容的問題,我們可以用Casting語法把a強迫轉換為Class B類別。


注意,以上例子我們產生一個"b",它是B類別的參考變數(Reference Variable),再運行b.methodB(); 但是其實b只會用一次,所以我們可以用匿名(Anonymous )方法,不用"b",直接用((B)a).methodB(); ,如下圖:

- 建立一個Class A。
- 建立一個Class B,然後繼承(extends)Class A。
- 建立一個Class A的Reference Variable a,然後把a指向物件b。
使用Casting語法把a強迫轉換為Class B類別,然後便可執行a.methodB()方法。
- 執行Run。