java 物件轉型記憶體分析
阿新 • • 發佈:2019-02-17
物件轉型:
一個基類的引用型別變數可以指向其子類的物件(要求傳個動物,傳給狗是可以的,狗是動物)
一個基類的引用不可以訪問其子類物件的新增成員(狗會游泳不代表所有的動物都會游泳,把狗當作動物來看時不可訪問狗游泳方法)
子類物件可以當作基類的物件來使用稱向上轉型,反之稱為向下轉型。
main函式:class Animal{ public String name; Animal(String name){ this.name=name; } } class Cat extends Animal{ public String eyesColor; Cat(String n,String c){ super(n);eyesColor=c; } } class Dog extends Animal{ public String furColor; Dog(String n,String c){ super(n);furColor=c; } }
public static void main(String args[]){ Animal a=new Animal("name"); Cat c = new Cat("catname","blue"); Dog d = new Dog("dogname","black"); System.out.println(d instance of Animal); //true 狗是動物 System.out.println(a instanceof Dog); //False 動物是狗,顯然邏輯錯誤,狗是動物,不能代表動物 a=new Dog("bigyellow","yellow"); //記憶體分析見下圖1 System.out.println(a.name); //bigyellow System.out.println(a.furname); //a是動物,new一個狗出來是把狗當作動物看,不可訪問狗的特殊成員變數,上文第二條 System.out.println(a instanceof Dog); //true new出來的實際是Dog //非要用a訪問dog的成員變數,必須強制轉換 Dog d1=(Dog)a; //記憶體分析見下圖2 System.out.println(d1.furColor); //yellow }
圖1:狗當作普通animal,a只能看見animal共有的東西,看不見狗毛色屬性
圖2:強制轉換,定義一個d1=a,在記憶體中分配一塊區間d1指向與a指向的相同的物件,d1是Dog型別的,所以可以看見dog的所有屬性