使用instanceof的場景
首先先要明確Java中存在編譯時類型和運行時類型,比如
Object obj = new String("xiaoysec");
其中,obj編譯時類型是Object類型的,運行時也就是實際的類型是String類型的,在Java中,一個父類引用指向子類對象,并調(diào)用重寫的方法就可以實現(xiàn)多態(tài)的效果,父類引用指向一個子類對象,這個是系統(tǒng)自動就完成那個的向下轉(zhuǎn)型,也規(guī)定了在這種情況下父類引用只能調(diào)用父類中定義的方法而不能調(diào)用子類中定義的方法,否則會報錯
那么如果父類引用一定要調(diào)用子類中定義方法,就需要將父類引用進行轉(zhuǎn)型,這種稱之為強制轉(zhuǎn)型
強制轉(zhuǎn)型
接上面的例子,Object obj = new String("xiaoysec"); ,
obj實際的類型是String類型的,編譯時類型是Object,需要進行轉(zhuǎn)型才能調(diào)用String類型的特有方法,需要知道這種轉(zhuǎn)型的條件:
- 首先編譯時類型和運行時類型需要存在繼承關(guān)系
在上面的例子中Object類型和String類型存在繼承關(guān)系,可以進行轉(zhuǎn)型,上例中如果父類對象的運行時類型也就是實際的類型是Object,進行強轉(zhuǎn)是會報錯的
** String str = (String)obj;** 完成轉(zhuǎn)型,這個時候就可以調(diào)用String類型的方法了
instanceof的引出
instanceof的出現(xiàn)可以說是為了程序的健壯性,因為如果出現(xiàn)了類型轉(zhuǎn)換不能進行的情況,就會報錯,使用instanceof就可以判斷是否可以轉(zhuǎn)換成功,這樣保證的程序的健壯性
instanceof的注意點
- A instancef B 首先A的類型是有其運行時類型也就是真是類型決定的
- 當A是B(一個類或者接口)的實例,子類實例,接口實現(xiàn)類實例的時候就返回true