Java多态之向下转型

往期回顾:我们学习了向上转型和动态绑定的概念,可以知道在继承关系中,将一个子类对象赋值给父类的引用变量,调用父类的方法,在实际运行时,就可以根据子类中重写的方法执行不同的操作。其中有一个弊端,就是在向上转型的过程中,其实丢失了一部分子类特有的功能,毕竟它只允许调用父类中的方法。那么,如何在这时调用子类中的方法呢,这时就需要与向上转型相对应的方法,就是所谓的:向下转型

向上转型是自动就能完成的,向下转型则需要强制类型转换

强制类型转换

我们前面提到过基本数据类型的强制转换,可以查看之前的文章:基本数据类型转换

引用变量的强制类型转换与基本数据类型类似,都需要用到类型转换运算符()

//将变量强制转换为type类型
type p = (type)变量

特别注意

  • 基本数据类型中,数值类型和布尔类型无法进行类型转换。
//错误!
boolean boo = true;
int in = (int)boo;
  • 不在继承关系中的两个类型无法进行强制类型转换。
//假设Person类和Dog类不具有继承关系,则下面会出错
Person p = new Person();
Dog dog = (Dog)p;
  • 就算在继承关系中,也不能把父类的实例转换成子类类型。(也就是说,引用变量必须编译时是父类类型,运行时是子类类型才可以)注意,编译时是不会报错的,只有运行时才会报错。
//假设Student继承于Person类
//编译时正常,运行时出错
Person p = new Person();
Student s = (Student)p;

instanceof

将一个父类引用赋给一个子类变量时,必须经过强制类型转换。如果出现强制类型转换双方不匹配的话,运行时通过(RTTI Run-Time Type Identification),即运行时类型识别,检查并返回ClassCastException,即类型转换异常

为了避免这一尴尬的问题发生,我们可以用instanceof运算符来检查,确保程序的健壮性。

instance是实例的意思,可想而知,instanceof表示判断前面的对象是否是后面的类,或者子类,实现类的实例。如果是就返回true,否则就false。

[引用类型变量] instanceof [类(接口)]

从上面诸多错误例子中随便举一个:

//在强制类型转换前加上instanceof语句判断
Person p = new Person();
if (p instanceof Student) {
Student s = ((Student) p);
}

这时,if判断语句中为false,里面自然无法执行,也就避免程序报错,保证了程序的健壮性。

Java多态之向下转型的更多相关文章

  1. java 多态 向上 向下转型

    向上转型 将子类对象当作父类对象     子类对象------>父类对象 先实例化子类 父类 父类对象 = 子类实例 package test2; class Father{ public vo ...

  2. java 向上,向下转型

    在对Java学习的过程中,对于转型这种操作比较迷茫,特总结出了此文.例子参考了<Java编程思想>. 目录 几个同义词 向上转型与向下转型 例一:向上转型,调用指定的父类方法 例二:向上转 ...

  3. java中的向下转型

    1.父类对象可以强制转换为子类对象,但是前提是此父类对象为子类对象实例化的结果. e.g. Fruit fruit=new Apple(); Apple a=(Apple)fruit;//ok e.g ...

  4. java中downcast向下转型到底有什么用

    What is the point of downcast? 当一个方法只有子类才有,马克-to-win:不是说基类和子类都有,开始时又是基类指针指向派生类,这时就需要downcast, see th ...

  5. 《java入门第一季》之面向对象(多态向下转型)

    上一篇博客(http://blog.csdn.net/qq_32059827/article/details/51328638)最后对多态的弊端做了显示,这里解决这个弊端.如下: /* 多态的弊端: ...

  6. 多态Poly中的向上/下转型 Upcast/Downcast

    [参考资料]马克-to-win java中多态polymorphism,向上转型和动态方法调度有什么用? java中什么叫多态,动态方法调度(dynamic method dispatch)? jav ...

  7. Java向上转型和向下转型(附具体样例)

                                                Java向上转型和向下转型(附具体样例) 熬夜整理的关于Java向上和向下转型的样例,很的通俗易懂哦~~~~ 一 ...

  8. 重新精读《Java 编程思想》系列之向上转型与向下转型

    前言 今天重读了一下向上转型与向下转型,有些新的体会,了解了向上转型的好处,及如何向下转型.在此分享给大家. 向上转型 向上转型是用来表现新类和基类之间的关系.在传统中,由导出类转型成基类,在继承图中 ...

  9. 09-02 java 多态

    多态的前提.多态的特点 /* 多态:同一个对象(事物),在不同时刻体现出来的不同状态. 举例: 猫是猫,猫是动物. 水(液体,固体,气态). 多态的前提: A:要有继承关系. B:要有方法重写. 其实 ...

随机推荐

  1. 剖析nsq消息队列目录

    剖析nsq消息队列(一) 简介及去中心化实现原理 剖析nsq消息队列(二) 去中心化源码解析 剖析nsq消息队列(三) 消息传输的可靠性和持久化[一] 剖析nsq消息队列(三) 消息传输的可靠性和持久 ...

  2. 2019-9-28:渗透测试,基础学习,DNS投毒

    该文章仅供学习,利用方法来自网络文章,仅供参考 DNS劫持 目标机:虚拟机下的win7系统 目标ip:192.168.20.131 目标:使用ettercap进行apr投毒,对win7系统就行,DNS ...

  3. K8s 集群节点在线率达到 99.9% 以上,扩容效率提升 50%,我们做了这 3 个深度改造

    点击下载<不一样的 双11 技术:阿里巴巴经济体云原生实践> 本文节选自<不一样的 双11 技术:阿里巴巴经济体云原生实践>一书,点击上方图片即可下载! 作者 | 张振(守辰) ...

  4. 【Luogu P4779】dijkstra算法的堆优化

    Luogu P4779 利用堆/优先队列快速取得权值最小的点. 在稠密图中的表现比SPFA要优秀. #include<iostream> #include<cstdio> #i ...

  5. C#学习笔记05--枚举/结构体

    一.枚举   当变量的取值范围是固定的几个时, 就可以使用枚举类型, 这样会更加简洁方便   1.1.定义: 访问修饰符 enum 枚举类型名 { 成员1, 成员2, 成员3, ... } publi ...

  6. day20190904一号店网页HTML+CSS

    1.知识要理一理.梳理.当天讲了什么内容?当天我学习到了什么内容?看懂.所有的学习型从模仿开始.1.看懂代码,看懂思路,学思路,多问自己问题,为什么要这么写?下一步为什么要这么写?因 果.2.多练多敲 ...

  7. P1046 陶陶摘苹果

    题目描述 陶陶家的院子里有一棵苹果树,每到秋天树上就会结出1010个苹果.苹果成熟的时候,陶陶就会跑去摘苹果.陶陶有个3030厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试. 现在 ...

  8. 部署 kube-controller-manager 高可用集群

    目录 前言 创建kube-controller-manager证书和私钥 生成证书和私钥 将生成的证书和私钥分发到所有master节点 创建和分发kubeconfig文件 分发kubeconfig到所 ...

  9. Centos 6.x Openssh 升级 7.7p1 版本

    OpenSSH 升级 目前在一家金融公司上班,正好赶上金融公司各种暴雷,本人心里慌慌的. 然后就是金融公司要进行的最低的三级等保评测,各种修改系统安全,密码强度.WAF.防火墙等各种. 评测公司对我司 ...

  10. R 语言学习笔记(1)——R 工作空间与输入输出

    什么是工作空间? 工作空间(workspace)就是当前 R 的工作环境,它储存着所有用户定义的对象(objectives)包括了向量.矩阵.函数.数据框.列表等. 处理 R 文件的工作流程 #设置当 ...