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