1. 程式人生 > >java 物件轉型記憶體分析

java 物件轉型記憶體分析

物件轉型:

     一個基類的引用型別變數可以指向其子類的物件(要求傳個動物,傳給狗是可以的,狗是動物)

     一個基類的引用不可以訪問其子類物件的新增成員(狗會游泳不代表所有的動物都會游泳,把狗當作動物來看時不可訪問狗游泳方法)

     子類物件可以當作基類的物件來使用稱向上轉型,反之稱為向下轉型。

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;
      }
}
main函式:
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的所有屬性