java 实现类转接口_JAVA 基础 / 第二十九课:接口与继承 / JAVA中的对象转型
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中的对象转型相关推荐
- JAVA 基础 / 第二十九课:接口与继承 / JAVA中的对象转型
2018-03-19 一.明确引用类型与对象类型的概念 引用类型与对象类型的概念 在这个例子里,有一个对象 new ADHero(), 同时也有一个引用ad 对象是有类型的, 是ADHero 引用也是 ...
- JAVA 基础 / 第二十九课:接口与继承 / JAVA 重写方法和多态
2018-03-19 子类可以继承父类的对象方法.在继承后,重复提供该方法,就叫做方法的重写:又叫覆盖 override 1.父类Item 父类Item有一个方法,叫做effect package p ...
- NeHe OpenGL第二十九课:Blt函数
NeHe OpenGL第二十九课:Blt函数 Blitter 函数: 类似于DirectDraw的blit函数,过时的技术,我们有实现了它.它非常的简单,就是把一块纹理贴到另一块纹理上. 这篇文章是有 ...
- NeHe OpenGL教程 第二十九课:Blt函数
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- python第二十九课——文件读写(复制文件)
自定义函数:实现文件复制操作有形参(2个) 没有返回值相似版(不用) def copyFile(src,dest):#1.打开两个文件:1个关联读操作,1个关联写操作fr=open(src,'rb') ...
- Python-opencv学习第二十九课:高斯双边模糊
Python-opencv学习第二十九课:高斯双边模糊 文章目录 Python-opencv学习第二十九课:高斯双边模糊 一.学习部分 二.代码部分 1.引入库 2.读入数据 3.完整代码 三.运行结 ...
- JAVA 基础 / 第二十八课:接口与继承 / 如何设计JAVA的接口?
2018-03-19 在设计LOL的时候,进攻类英雄有两种,一种是进行物理系攻击,一种是进行魔法系攻击.这时候,就可以使用接口来实现这个效果. 接口就像是一种约定,我们约定某些英雄是物理系英雄,那么 ...
- Java调用大数据接口,学习Hadoop第二十八课(java通过调用接口来操作HBase)
上节课我们一起简单学习了HBase的一些理论,这节课我们一起学习用java调HBase的接口来操作HBase. 我们首先建一个工程,这里我们还用原始的新建一个lib包.然后我们把下载的hbase-0. ...
- 重学java基础第二十五课:数据类型
最新文章
- 触摸屏与计算机通讯视频在线,MCGS触摸屏与电脑调试软件modbus通讯
- 实时分析态势感知大数据日志
- CSS hack浏览器兼容一览表
- android各目录大小,Android 基础篇 — 放不同drawable文件夹中图片的大小
- 一个报文的路由器之旅_【NE探秘】一个报文的路由器之旅
- 深入理解lombok
- jax-rs jax-ws_您的JAX-RS API并非天生就等于:使用动态功能
- 部署gradle_使用Gradle消除开发重新部署
- 文件上传 java 完美,vue+java实现文件上传(excel等),会出现跨域问题,直接用form表单提交就不会有问题了(new FormData())...
- 微内核和宏内核的区别(短小、精悍)
- react api_如何在WordPress REST API之上构建React应用
- Python高级——Web静态服务器(面向对象)
- mysql输出重定向_将MySQL输出内容写入(重定向到)文件
- 年底各类大型年会晚会必用的高清丝绸海报设计背景来喽!
- 找不到可安装的ISAM
- Java Web架构实战篇:聊一聊前后端分离架构
- iOS13免越狱修改微信提示音方法!亲测有用!
- 『HTMLCSS』选择器(二)
- 第三方平台可以通过微信公众平台素材管理接口实现同步了
- 4070显卡相当于什么水平 4070显卡参数 rtx4070显卡功耗
热门文章
- 教你如何在Spark Scala/Java应用中调用Python脚本
- 云小课 |选定合适的证书,做“有证”的合规域名
- 来看看Python炫酷的颜色输出与进度条打印
- 补习系列(15)-springboot 分布式会话原理
- 【云速建站】页面产品维护简述
- #华为云·寻找黑马程序员# 如何实现一个优雅的Python的Json序列化库
- 简单计算机app inventor,app inventor计算器
- cmdb python 采集虚拟机_Python编程(三十四):CMDB后台管理、封装自定义JS组件、前端td标签定制显示内容及属性...
- 红橙Darren视频笔记 view的invalidate调用draw方法的流程(源码分析基于api 29)
- gradle命令无法识别