# 多態
> Java引用類型變量有兩種類型:一種是編譯時的類型,一種是運行時的類型。
* 編譯的類型是由聲明變量的時候決定的。
* 運行時類型由實際賦給該變量的對象決定。
如果運行時的類型和編譯時的類型不一致就會出現所謂的多態。
- 首先編譯時類型和運行時類型是一種父類和子類的關系。
- 多態最常用的場景就是子類重寫父類的方法后,如果引用變量的類型為父類,而對象為子類,如果引用類型調用重寫方法,會去執行子類定義的實現。
## 引用類型的強制類型轉換
編寫Java程序時,引用變量只能調用他編譯時的方法,而不能調用其運行時類型的方法。如果你必須要調用其運行時的類型,則需要進行強制類型轉換。
強制類型轉換是把大的類型轉換為小的類型。
在我們的引用數據里,大的類型是父類,小的類型是子類。
只可能發生在子類和父類的關系中
## instanceof運算符
instance運算符的前一個操作數一般是引用數據類型變量,后一個操作數是類名(接口),它是用于判斷前面的對象是否是后面的類、或者其子類。如果是的話,返回true。
> instanceof運算符一般用于在我們對引用數據類型進行強制類型轉換之前判斷使用。
> 避免在實際的運行過程中出現 ClassCastException
實例代碼:
~~~
public class Client1 {
public static void main(String[] args) {
Animal tom = new Dog();
Animal mimi = new Cat();
Animal ani1 = new Animal();
if (ani1 instanceof Dog) { // 此處ani1的數據類型為 Animal 所以運算的結果為 false
Dog dog1 = (Dog) ani1;
System.out.println(dog1.getAge());
}
if (tom instanceof Dog) { // 此處tom運行時數據類型為 Dog 所以運算的結果為 true,可以進行轉換
Dog dog2 = (Dog) tom; // 強制類型轉換
dog2.setAge(20);
System.out.println(dog2.getAge());
}
tom.cry();
mimi.cry();
}
}
~~~