物件轉型分為兩種:一種叫向上轉型(父類物件的引用或者叫基類物件的引用指向子類物件,這就是向上轉型),另一種叫向下轉型。轉型的意思是:如把float型別轉成int型別,把double型別轉成float型別,把long型別轉成int型別,這些都叫轉型。把一種形式轉成另外一種形式就叫轉型。除了基礎資料型別的轉型之外(基礎資料型別的轉型:大的可以轉成小的,小的也可以轉成大的。),物件領域裡面也有物件之間的轉型。
在記憶體中可以看到,指向dog類例項物件的引用物件a是乙個animal型別的引用型別,這就比較有意思了,animal型別指向了dog這個物件,那麼,在程式的眼睛裡會把這只dog當成乙隻普通的animal,既然是把dog當成乙隻普通的animal,那麼dog類裡面宣告的成員變數furcolor就不能訪問了,因為animal類裡面沒有這個成員變數。因此,從嚴格意義上來講,這個a眼裡只看到了這個子類物件裡面的父類物件animal,因此能訪問得到的也只是這個animal物件裡面的name屬性,而這個animal物件外面的furcolor屬性是訪問不到的,雖然dog物件確實有這個屬性存在,但a就是看不到,a門縫裡看dog——把dog看扁了,不知道dog還有furcolor這個屬性存在,因此a訪問不了furcolor屬性,因此從嚴格意義上來講,a指向的只是這個dog物件裡面的animal物件,也就是黃色箭頭指向的那部分,a就只看到了dog裡面這部分,而dog外面的部分都看不到了。這就是父類引用指向子類物件,父類引用指向子類物件的時候,它看到的只是作為父類的那部分所擁有的屬性和方法,至於作為子類的那部分它沒有看到。
如果真的想訪問dog物件的furcolor屬性,那就採用物件轉型的辦法,把父類物件的引用轉型成子類物件的引用。dog d1 = (dog)a;這裡採用的就是物件轉型的辦法,把a強制轉換成乙隻dog物件的引用,然後將這個引用賦值給dog型的引用變數d1,這樣d1和a都是指向堆記憶體裡面的dog物件了,而且d1指向的就是這只dog所有的部分了,通過這個d1就可以訪問dog物件裡面所有的成員了。
向上轉型和向下轉型
向上轉型 子類向上轉型為父類 注意點 轉型後父類與子類的同名函式中,子類的函式可以覆蓋父類的函式,但子類自己定義的函式將被隱藏 class a public void a2 class b extends a public void b2 public class c 向下轉型 父類被強制轉型為子類...
向上轉型和向下轉型
例如我現在有兩個類,他們之間是繼承的關係 class animal class dog extends animal void bark 通俗地講,向上轉型就是把子類的物件轉化為父類的物件,如 animal animal new dog 但是注意,向上轉型後,父類只能訪問與子類共有的方法,如以下 就...
向上轉型和向下轉型
在j a中,繼承是乙個重要的特徵,通過extends關鍵字,子類可以復用父類的功能,如果父類不能滿足當前子類的需求,則子類可以重寫父類中的方法來加以擴充套件。而在應用中就存在著兩種轉型方式。比如有父類parent,子類child1.向上轉型 父類的引用指向子類的例項parent p new chil...