为什么会发生向上转型和向下转型?
向上转型是为了调用父类中的方法,向下转型是为了使用完后转回子类,以此才能调用父类中没有的方法。
向上转型和向下转型都有三种方法:直接赋值、作为参数和作为返回值类型。
对象类型转换主要分为以下两种情况:
(1)向上转型:子类对象→父类对象。 (把一个子类对象提升为父类型,"父类引用指向子类对象",好处是"可以提高方法的灵活性")
向上转型时,父类指向子类引用对象,会遗失子类中父类没有的方法,也就是在转型过程中,子类的新的方法都会遗失掉
"anmalsk a= new dog1():从右往左看,先开辟了一个子类(dog1)对象空间,该空间已经实例化了dog1类的所有方法及属性等,空间的地址给了a这个变量,本来a是可以调用dog1所有方法的,但现在给了一个animalsk类限制,所以a只能调用animalsk类型与dog1类型的共有方法"
(2)向下转型:父类对象→子类对象。(把一个父类型的对象转回子类型)
对于向上转型,程序会自动完成,而向下转型时,必须指明要转型的"子类类型"。
向下转型的发生是在这个变量"已经完成过向上转型",现在要转回原本类型的操作
所以instanceof关键字是进行向下转型是否"安全的判断"(判断这个变量是否"已经完成过向上转型")
多态的弊端,无法使用"子类特有成员"
如果想使用"子类特有成员",就需要向下转型,
子类类名 对象名 =(子类类型)父类对象
public abstract class anmalsk
{
public abstract void shout();
}
public class dog1 extends anmalsk{
public void shout()
{
System.out.println("狗汪汪叫");
}
public void show()
{
System.out.println("我是狗");
}
}
public class text6 {
public static void main(String[] args)
{
anmalsk a= new dog1(); /父引用指向子类(向上转型) "直接赋值法"
a.shout(); /调用dog1的shout方法
//a.show 报错,a只能调用animalsk类型与dog1类型的共有方法"
dog1 d=new dog1();
useanimal(d); /父引用指向子类(向上转型) "作为参数法"
cat1 c=new cat1();
useanimal(c); /运行到次句时会出错,把cat1对象c传入useanimal(),只能"执行第1句,无法执行第2句与第3句",因为cat1与dog1并不是父子关系,所以cat1的对象无法向下转型并调用show函数,
但可以用if()语句加instanceof关键字来划开。
}
/通用方法可以接收任意的子类对象,(多态使用场景)
public static void useanimal(anmalsk a) /父类对象做参(父引用指向子类) = "anmalsk a=new dog1()";
{
第1句 a.shout();
//a.show();此句报错,无法使用dog1子类特有成员
//所以需要向下转型先把父类对象a转为dog1子类型对象
第2句 dog1 d1=(dog1)a;//向下转型先把父类a转为dog1子类型对象
第3句 d1.show();/用子类自己对象调用自己函数
}
}
向下转型的发生是在这个变量已经完成过向上转型,现在要转回类型的操作
所以instanceof关键字是进行向下转型是否安全的判断
Java中可以使用instanceof关键字判断一个对象是否是某个类(或接口)的实例,
语法格式如下所示: "对象 instanceof类(或接口)"
在上述格式中,如果对象是指定的类的实例对象,则返回true,
否则返回false。
上面代码区域完善
public static void useanimal(anmalsk a) /(父引用指向子类)anmalsk a=new dog1();
{
a.shout();
if(a instanceof dog1) /判断a这个参数接收的,是不是dog1类型的
{
dog1 d1=(dog1)a;//向下转型先把父类型变量a强制转为dog1子类型对象
d1.show(); //d1调用dog1类中自己的show函数
}
文章浏览阅读4.3k次。MQTT是一个由IBM主导开发的物联网传输协议,它被设计用于轻量级的发布/订阅式消息传输,旨在为低带宽和不稳定的网络环境中的物联网设备提供可靠的网络服务。应项目要求使用MQTT协议实现客户端与服务端通信。_mqttandroidclient
文章浏览阅读1.2k次。1.本来电脑安装的是anaconda3 5.3.1,但安装的python版本是3.7,后来卸载了安装anaconda3 4.4.0,这个版本是3.62.打开Anaconda Promptconda --version //检查Anaconda是否成功安装(如果成功会显示版本号)conda update conda //更新conda版本conda create -n tensorflow p..._anaconda3+对应python3.6
文章浏览阅读1.1w次,点赞18次,收藏124次。第十一届蓝桥杯单片机省赛题目解析这次题目照样还是LED、数码管、按键三大模块,还有模拟电压输入(ADC)、AT24C02(EEPROM),都是常见的外设,且之前题目出现过的,所以不难,考的都是基本功。1 数码管显示数码管主要显示获取的电压、计数和参数设置三个界面,不过要注意上电之后就要显示电压数据界面。2 LED当电压小于设置的参数时5s后L1亮,这个还是很好做的。当计数为奇数时L2亮,计数的话,我是先判断电压是..._蓝桥杯单片机考什么
文章浏览阅读484次。DescriptionGiven n differentobjects, you want to take k of them. How many ways to can do it? For example, saythere are 4 items; you want to take 2 of them. So, you can do it 6 ways. Take 1, _快速幂求逆元 在线oj
文章浏览阅读6.6k次,点赞10次,收藏23次。现在开头:Fairseq是一个正在快速迭代的产品,而且是开源的!这不是表扬,这意味着三件事情:1.他没有文档!所有框架代码都没有任何注释,包括函数docstring都没有2.他没有经过有效测试,估计是抢时间吧!即使是官网Readme里的例子也是无法跑起来的!3.他是一个框架,而且是一个非常不Pythonic的框架,充斥着inline/包装器/莫名其妙的语法。虽然这三点决定他真的对不住Facebook的金字招牌,但是作为一个学习者,总要把他运行起来,那么开始这场针对 FaceBOOK派“全_final_lr_scale
文章浏览阅读5.1k次。目录摘要:基本操作与命令介绍:进入top后交互一点点新的操作Author: Keivn.Xu [email protected]摘要: 玩过Linux一定使用过busybox top命令,但下面的操作方法,你不一定有见过。基本操作与命令介绍:console:/ $ busybox top -help top: invalid optio..._busybox top
文章浏览阅读970次,点赞10次,收藏9次。DRW寄存器将AP访问直接映射到一个32位内存访问:对DRW的写入命令MEM-AP启动对内存系统的写入访问DRW的读取命令MEM-AP启动对内存系统的读取访问。对于SWD编程,我们可以将CSW设置为(2_swd下载程序时序
文章浏览阅读3.3k次。ASCON:以“慢而稳”赢得NIST轻量级加密算法标准_ascon
文章浏览阅读982次。全部已在本机验证,可能根据用户安装的系统功能不同而有些命令无效。设备管理器 hdwwiz.cpl 或devmgmt.msc添加或删除程序 appwiz.cpl管理工具 control admintoolsBluetooth文件传送向导 fsquirt计算器 calc证书管理控制台 certmgr.msc字符映..._window bat call 环境
文章浏览阅读1.1w次,点赞8次,收藏82次。相机标定_相机标定
文章浏览阅读1.1k次。const date = new Date()const year = date.getFullYear()const month = date.getMonth() + 1 >= 10 ? date.getMonth() + 1 : `0${date.getMonth() + 1}`const day = date.getDate() >= 10 ? date.getDate() : `0${date.getDate()}`const hours = date.getHours() ._js 时分秒 时间格式
文章浏览阅读2.2k次。摘要:简述重建索引的情况及重建索引_oracle 重建索引