為什么父類引用可以指向子類對象 子類引用不能指向父類對象 泛型


假設有父類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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM