物件轉型(instanceof關鍵字)
1、物件之間的轉換並非是隨意進行的轉換,在基本型別的轉換中,有自動型別轉換,還有一種強制型別轉換,但是物件型別的轉換不能強制地隨意地進行轉換,而是有一種約束,是一種上下繼承層次關係的轉換。
2、instanceof關鍵字:
(1)使用方法:引用空格instanceof空格類名
例如:a instanceof Cat;
意思就是**a所指的物件的型別(並非是a引用的型別,是a所指物件的型別)**是否是Cat類或者是屬於Cat子類
(2)作用:用於判斷引用所指的物件是否屬於該類或者該類的子物件
(3)返回值:true或者是false
(1)a所指的物件是pet,所以是對的;c所指的物件是cat,cat是pet的子類,所以是對的;d指的物件是dog,dog是pet的子類,所以是對的;a指的物件不是cat類,也不是cat的子類,所以也是錯誤的。
(2)可以把一個dog型別的物件賦值給一個pet型別的引用,子類是可以賦值給一個父類型別的變數/引用,子類對父類的賦值實際就是子類物件中繼承自父類的部分賦值給父類物件!
(3)雖然a=new Dog("","");
,但是a還是pet型別,只不過a所指的物件為Dog而已,因為父類引用不能訪問子類新增成員,所以輸出a.furColor是錯誤的。
(4)a是pet型別的,但是a所指的物件變成了Dog型別的了, Dog為pet子類,所以返回值為true。
(5)如果就是想通過父類來使用子類新增的成員變數的話,只能對a進行強制型別轉換,比如將pet型別的引用轉換為Dog型別的引用,次轉換為向下轉換,d1是Dog型別物件,它可以指向的只能是Dog型別的物件或者是Dog型別的子物件
注意: 這樣的轉換時有風險的,因為,如果之後a所指的物件不是dog,而是cat的話,進行變成dog的強制型別轉換時正確的,但是卻沒有皮毛這個成員變數,所以編譯的過程中是正確的,但是執行的過程中會報錯。
3、例項1: 將pet型別的引用轉換為cat,因為進行強制型別轉換了,所以編譯的時候是正確的,但是執行的時候會出錯,因為,引用c是Cat型別的物件,它可以指向的物件只能是Cat型別的物件或者是Cat型別的子物件,但是上面的a指向的是pet型別的物件,所以會報錯。
4、