假設有父類Fu ,其子類為Zi ,從對象的內存角度,假設Fu類里面的變量占內存2M, Zi 類里的變量占內存1M:
Fu f = new Fu ();//系統將分配2M內存
Zi z = new Zi ();//系統將分配3M內存(2+1)
因為子類中有一個隱藏的引用super會指向父類實例,所以在實例化子類之前會先實例化一個父類,也就是說會先執行父類的構造函數.所以z可以調用父類的方法.
Zi z1= z; //z1指向那3M的內存.
Fu f1 = (Fu)z;//這時f1會指向那3M內存中的2M內存,即是說,f1只是指向了z中實例的父類實例對象,所以f1只能調用父類的方法(存儲在2M內存中),而不能調用子類的方法(存儲在1M內存中).
Zi z2= (Zi)f;//這句代碼運行時會報ClassCastException.因為f中只有2M內存,而子類的引用都必須要有3M的內存,所以無法轉換
Zi z3= (Zi)f1;//這句可以通過運行,這時z3指向那3M的內存.由於f1是由z轉換過來的,所以它是有3M的內存的,只是它指向3M中的2M內存,類型轉換時,就可以拿到全部3M。
泛型類型由於沒有Class類,所有無法new。只能用來類型強轉
下面是一個類型轉換的案例
Object[] ins= { new Integer(0), new Integer(1), new Integer(2), new Integer(3), }; Integer[] i = (Integer[]) ins;
執行時,系統報
Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer;
如果改成下面的方式就可以了:
Object[] ins= { new Integer(0), new Integer(1), new Integer(2), new Integer(3), }; Integer[] i = new Integer[ins.length]; for(int k = 0; k < ins.length; k++){ i[k] = Integer.parseInt(ins[k].toString()); System.out.println(i[k]); }
為什么Object[]數組不能強轉成Integer[]數組呢?
其實Object[]數組和Integer[]數組之前的關系並沒有繼承之間的關系,Integer[]的是Object的子類,並不是Object[]數組的之類.
Object[]數組是Object的之類.....
強轉的話還是要一個個的對單獨的元素進行強轉.
————————————————
原文鏈接:https://blog.csdn.net/lifewinnerforever/article/details/72801247