当前位置: 首页>开发笔记>正文

为什么父类引用可以指向子类对象 子类引用不能指向父类对象 泛型

为什么父类引用可以指向子类对象 子类引用不能指向父类对象 泛型

假设有父类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://www.zydui.com/af65aV28HAgQ.html
>

相关文章:

  • 调用泛型对象的方法
  • 泛型对象
  • 父类创建子类的对象
  • 子类对象可以直接复制给父类对象
  • java怎么判断子类对象
  • 子类继承父类的构造方法
  • 面向对象程序语法
  • java 父类强转子类
  • vscode搭建nodejs環境,關于VS code ESP-IDF 提示“loading ‘build.ninja‘: 系統找不到指定的文件” 的解決方案
  • 什么是應用軟件并舉例,16.應用舉例
  • 【面經】美團春招三輪面經分享~涵蓋眾多知識點
  • 2021年面試題目,面試題--新增
  • magic king怎么讀,magick++ 簡介
  • 微信怎么設置定時發送,朋友圈可以定時發送嗎?
  • can not connect to rpc service,RPC service
  • ftpserver安卓版,FTPServer
  • server u使用教程,Server-U
  • rpc服務器,RPC 和 Web Service 有什么區別?
  • rpc服務器,web service和rpc的區別
  • psexec
  • dhclient命令,hpe?3par命令行查看狀況腳本
  • hp存儲默認管理口地址,HP3par 多路徑存儲磁盤使用方法
  • hp3par命令行手冊,3par命令集
  • 存儲器芯片的地址范圍,存儲器芯片類別有哪些?
  • 在pc機中各類存儲器,1.14各類存儲器芯片
  • 存儲芯片漲價最新消息,存儲器芯片
  • Windows/Linux性能監控軟件>csv文件,方便生成圖表
  • sqlserver nvarchar,【SQL開發實戰技巧】系列(四十五):Oracle12C常用新特性?VARCHAR2/NVARCHAR2類型最大長度由40
  • arcgis怎么導入地圖,Arcgis路網導入3dmax批量改成道路面
  • 定義animal父類,定義一個父類Animal eat方法 , 定義兩個子類 Dog 特有方法keepHome , Cat 特有方法 catchMouse ;并
  • 手機連接兩個藍牙方法,打開藍牙的設置
  • iconfont圖標免費嗎,關于阿里矢量圖標彩色icon使用
  • ps制作賽博朋克風格,如何用ps做出賽博朋克的風格?
  • ue4綠幕實時導入場景,如何在UE4中制作賽博朋克LED效果
  • 產品經理有哪些培訓課程,2023年全國NPDP產品經理國際認證火熱招生啦
  • B端產品需要什么能力,NPDP認證|B端產品經理是如何做競品調研的?
  • 超級工具,Supershell 一款牛叉閃閃的工具
  • buffer在c語言中是什么意思,QBuffer 用法理解