2018-03-19

一、明确引用类型与对象类型的概念

引用类型与对象类型的概念

在这个例子里,有一个对象 new ADHero(), 同时也有一个引用ad

对象是有类型的, 是ADHero

引用也是有类型的,是ADHero

通常情况下,引用类型和对象类型是一样的

接下来要讨论的类型转换的问题,指的是引用类型和对象类型不一致的情况下的转换问题

packagecharactor;public classHero {publicString name;protected floathp;public static voidmain(String[] args) {

ADHero ad= newADHero();

}

}

二、子类转父类(向上转型)

所谓的转型,是指当引用类型和对象类型不一致的时候,才需要进行类型转换

类型转换有时候会成功,有时候会失败(参考基本类型的类型转换)

到底能否转换成功? 教大家一个很简单的判别办法把右边的当做左边来用,看说得通不

Hero h = newHero();

ADHero ad= newADHero();

h= ad;

右边ad引用所指向的对象的类型是 物理攻击英雄

左边h引用的类型是 普通英雄

把物理攻击英雄 当做 普通英雄,说不说得通? 说得通,就可以转

所有的子类转换为父类,都是说得通的。比如你身边的例子

苹果手机 继承了 手机,把苹果手机当做普通手机使用

怡宝纯净水 继承了 饮品, 把怡宝纯净水 当做饮品来使用

苍老师 继承了动物, 把苍老师 。。。

packagecharactor;public classHero {publicString name;protected floathp;public static voidmain(String[] args) {

Hero h= newHero();

ADHero ad= newADHero();//类型转换指的是把一个引用所指向的对象的类型,转换为另一个引用的类型//把ad引用所指向的对象的类型是ADHero//h引用的类型是Hero//把ADHero当做Hero使用,一定可以h=ad;

}

}

三、父类转子类(向下转型)

父类转子类,有的时候行,有的时候不行,所以必须进行强制转换。

强制转换的意思就是 转换有风险,风险自担。

什么时候行呢?

Hero h =newHero();

ADHero ad= newADHero();

h=ad;

ad= (ADHero) h;

第3行,是子类转父类,一定可以的;第4行,就是父类转子类,所以要进行强转。

h这个引用,所指向的对象是ADHero, 所以第4行,就会把ADHero转换为ADHero,就能转换成功。

什么时候转换不行呢?

Hero h =newHero();

ADHero ad= newADHero();

Support s=newSupport();

h=s;

ad= (ADHero)h;

第4行,是子类转父类,是可以转换成功的

第5行,是把h引用所指向的对象 Support,转换为ad引用的类型ADHero。 从语义上讲,把物理攻击英雄,当成辅助英雄来用,说不通,所以会强制转换失败,并且抛出异常

以下是对完整的代码的关键行分析

14行: 把ad当做Hero使用,一定可以转换之后,h引用指向一个ad对象。

15行: h引用有可能指向一个ad对象,也有可能指向一个support对象,所以把h引用转换成AD类型的时候,就有可能成功,有可能失败;

因此要进行强制转换,换句话说转换后果自负,到底能不能转换成功,要看引用h到底指向的是哪种对象

在这个例子里,h指向的是一个ad对象,所以转换成ADHero类型,是可以的

16行:把一个support对象当做Hero使用,一定可以;转换之后,h引用指向一个support对象。

17行:这个时候,h指向的是一个support对象,所以转换成ADHero类型,会失败;失败的表现形式是抛出异常 ClassCastException 类型转换异常。

packagecharactor;importcharactor1.Support;public classHero {publicString name;protected floathp;public static voidmain(String[] args) {

Hero h=newHero();

ADHero ad= newADHero();

Support s=newSupport();

h=ad;

ad=(ADHero) h;

h=s;

ad=(ADHero)h;

}

}

四、没有继承关系的两个类,互相转换

没有继承关系的两个类,互相转换,一定会失败

虽然ADHero和APHero都继承了Hero,但是彼此没有互相继承关系

"把魔法英雄当做物理英雄来用",在语义上也是说不通的

packagecharactor;public classHero {publicString name;protected floathp;public static voidmain(String[] args) {

ADHero ad= newADHero();

APHero ap= newAPHero();//没有继承关系的类型进行互相转换一定会失败,所以会出现编译错误

ad =(ADHero) ap;

}

}

五、实现类转换成接口(向上转型)

引用ad指向的对象是ADHero类型,这个类型实现了AD接口

10行: 把一个ADHero类型转换为AD接口

从语义上来讲,把一个ADHero当做AD来使用,而AD接口只有一个physicAttack方法,

这就意味着转换后就有可能要调用physicAttack方法,而ADHero一定是有physicAttack方法的,所以转换是能成功的。

packagecharactor;public classHero {publicString name;protected floathp;public static voidmain(String[] args) {

ADHero ad= newADHero();

AD adi=ad;

}

}

六、接口转换成实现类(向下转型)

10行: ad引用指向ADHero, 而adi引用是接口类型:AD,实现类转换为接口,是向上转型,所以无需强制转换,并且一定能成功

12行: adi实际上是指向一个ADHero的,所以能够转换成功

14行: adi引用所指向的对象是一个ADHero,要转换为ADAPHero就会失败。

假设能够转换成功,那么就可以使用magicAttack方法,而adi引用所指向的对象ADHero是没有magicAttack方法的。

packagecharactor;public classHero {publicString name;protected floathp;public static voidmain(String[] args) {

ADHero ad= newADHero();

AD adi=ad;

ADHero adHero=(ADHero) adi;

ADAPHero adapHero=(ADAPHero) adi;

adapHero.magicAttack();

}

}

七、instanceof

instanceof Hero 判断一个引用所指向的对象,是否是Hero类型,或者Hero的子类

packagecharactor;public classHero {publicString name;protected floathp;public static voidmain(String[] args) {

ADHero ad= newADHero();

APHero ap= newAPHero();

Hero h1=ad;

Hero h2=ap;//判断引用h1指向的对象,是否是ADHero类型

System.out.println(h1 instanceofADHero);//判断引用h2指向的对象,是否是APHero类型

System.out.println(h2 instanceofAPHero);//判断引用h1指向的对象,是否是Hero的子类型

System.out.println(h1 instanceofHero);

}

}

java 实现类转接口_JAVA 基础 / 第二十九课:接口与继承 / JAVA中的对象转型相关推荐

  1. JAVA 基础 / 第二十九课:接口与继承 / JAVA中的对象转型

    2018-03-19 一.明确引用类型与对象类型的概念 引用类型与对象类型的概念 在这个例子里,有一个对象 new ADHero(), 同时也有一个引用ad 对象是有类型的, 是ADHero 引用也是 ...

  2. JAVA 基础 / 第二十九课:接口与继承 / JAVA 重写方法和多态

    2018-03-19 子类可以继承父类的对象方法.在继承后,重复提供该方法,就叫做方法的重写:又叫覆盖 override 1.父类Item 父类Item有一个方法,叫做effect package p ...

  3. NeHe OpenGL第二十九课:Blt函数

    NeHe OpenGL第二十九课:Blt函数 Blitter 函数: 类似于DirectDraw的blit函数,过时的技术,我们有实现了它.它非常的简单,就是把一块纹理贴到另一块纹理上. 这篇文章是有 ...

  4. NeHe OpenGL教程 第二十九课:Blt函数

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  5. python第二十九课——文件读写(复制文件)

    自定义函数:实现文件复制操作有形参(2个) 没有返回值相似版(不用) def copyFile(src,dest):#1.打开两个文件:1个关联读操作,1个关联写操作fr=open(src,'rb') ...

  6. Python-opencv学习第二十九课:高斯双边模糊

    Python-opencv学习第二十九课:高斯双边模糊 文章目录 Python-opencv学习第二十九课:高斯双边模糊 一.学习部分 二.代码部分 1.引入库 2.读入数据 3.完整代码 三.运行结 ...

  7. JAVA 基础 / 第二十八课:接口与继承 / 如何设计JAVA的接口?

    2018-03-19 在设计LOL的时候,进攻类英雄有两种,一种是进行物理系攻击,一种是进行魔法系攻击.这时候,就可以使用接口来实现这个效果.  接口就像是一种约定,我们约定某些英雄是物理系英雄,那么 ...

  8. Java调用大数据接口,学习Hadoop第二十八课(java通过调用接口来操作HBase)

    上节课我们一起简单学习了HBase的一些理论,这节课我们一起学习用java调HBase的接口来操作HBase. 我们首先建一个工程,这里我们还用原始的新建一个lib包.然后我们把下载的hbase-0. ...

  9. 重学java基础第二十五课:数据类型

最新文章

  1. 触摸屏与计算机通讯视频在线,MCGS触摸屏与电脑调试软件modbus通讯
  2. 实时分析态势感知大数据日志
  3. CSS hack浏览器兼容一览表
  4. android各目录大小,Android 基础篇 — 放不同drawable文件夹中图片的大小
  5. 一个报文的路由器之旅_【NE探秘】一个报文的路由器之旅
  6. 深入理解lombok
  7. jax-rs jax-ws_您的JAX-RS API并非天生就等于:使用动态功能
  8. 部署gradle_使用Gradle消除开发重新部署
  9. 文件上传 java 完美,vue+java实现文件上传(excel等),会出现跨域问题,直接用form表单提交就不会有问题了(new FormData())...
  10. 微内核和宏内核的区别(短小、精悍)
  11. react api_如何在WordPress REST API之上构建React应用
  12. Python高级——Web静态服务器(面向对象)
  13. mysql输出重定向_将MySQL输出内容写入(重定向到)文件
  14. 年底各类大型年会晚会必用的高清丝绸海报设计背景来喽!
  15. 找不到可安装的ISAM
  16. Java Web架构实战篇:聊一聊前后端分离架构
  17. iOS13免越狱修改微信提示音方法!亲测有用!
  18. 『HTMLCSS』选择器(二)
  19. 第三方平台可以通过微信公众平台素材管理接口实现同步了
  20. 4070显卡相当于什么水平 4070显卡参数 rtx4070显卡功耗

热门文章

  1. 教你如何在Spark Scala/Java应用中调用Python脚本
  2. 云小课 |选定合适的证书,做“有证”的合规域名
  3. 来看看Python炫酷的颜色输出与进度条打印
  4. 补习系列(15)-springboot 分布式会话原理
  5. 【云速建站】页面产品维护简述
  6. #华为云·寻找黑马程序员# 如何实现一个优雅的Python的Json序列化库
  7. 简单计算机app inventor,app inventor计算器
  8. cmdb python 采集虚拟机_Python编程(三十四):CMDB后台管理、封装自定义JS组件、前端td标签定制显示内容及属性...
  9. 红橙Darren视频笔记 view的invalidate调用draw方法的流程(源码分析基于api 29)
  10. gradle命令无法识别