向下轉型操作:將父類轉化爲某個子類。如:將Object類轉爲String類,再通俗講就是將四邊形轉爲平行四邊形。通常這樣的轉型會出錯,因爲四邊形不一定是平行四邊形,這時我們通常需要用instanceof先進行判斷。
在程序執行向下轉型操作時,如果父類對象不是子類對象的實例,就會發生ClassCastExceptio異常。因此在執行向下轉型之前需要養成一個良好的習慣,就是判斷父類對象是否爲子類對象的實例,通常我們使用instanceof來完成。instanceof的語法格式如下:
myobject instanceof ExampleClass
其中,myobject :某類的對象引用 ExampleClass : 某個類
示例:
class Quarangle{
public void draw(Quarangle q){
System.out.println("this is Quarangle");
}
}
class Square extends Quarangle{
}
class Anything{
}
public class instanceofTest {
public static void main(String[] args) {
Quarangle quarangle=new Quarangle();
Quarangle qu=new Square();
Square sq=new Square();
if(quarangle instanceof Square){
System.out.println("==========");
}else {
System.out.println("######");
}
if(sq instanceof Quarangle){
sq.draw(sq);
}else {
System.out.println("----");
}
if(qu instanceof Square){
System.out.println("*****");
}else {
System.out.println("&&&");
}
// if(quarangle instanceof Anything){ //這條語句idea直接編譯沒通過,eclipse是否能通過可以去嘗試一下
// Anything anything=(Anything) quarangle;
// }
}
}
運行結果:
<span style="color:#000000;">######
this is Quarangle
*****
</span>
結果分析:
條件:Quarangle 是Square的父類
第一組:因爲Quarangle 是Square的父類,所以當我們實例化一個Quarangle 時,他有可能是Square類,故在編譯上沒有問題。但父類不一定是子類的一個實例,子類一定是父類的一個實例,所以輸出if 判斷爲 false
第二組:子類一定是父類的一個實例,所以 if 判斷爲true
第三組: 我們實例化的是一個Quarangle對象,但已經明確知道了這個Quarangle是Square類型的,即qu是Square的實例,所以 if 判斷爲true
第四組: Anything 不是Quarangle的子類,也不是其父類,兩者並沒有聯繫,所以 未通過編譯。