因为多态的存在,就一定会有把子类对象赋值给父类变量的时候,这个时候,在编译期间,就会出现类型转换的现象。

但是,使用父类变量接收了子类对象之后,我们就不能调用子类拥有,而父类没有的方法了。这也是多态给我们带来的一点"小麻烦"。所以,想要调用子类特有的方法,必须做类型转换,使得编译通过。

总结: 因为将子类对象赋值给父类引用,是不能使用子类中的属性或方法的,但是我们又需要使用,因而我们需要将父类强制向下转型为子类类型,从而可以使用子类的属性或方法。
Person p = new Man();

不是所有通过编译的向下转型都是正确的,可能会发生ClassCastException,为了安全,可以通过isInstanceof关键字进行判断。

只要用instanceof判断返回true的,那么强转为该类型就一定是安全的,不会报ClassCastException异常。

public class TestInstanceof {public static void main(String[] args) {Pet[] pets = new Pet[2];pets[0] = new Dog();//多态引用pets[0].setNickname("小白");pets[1] = new Cat();//多态引用pets[1].setNickname("雪球");for (int i = 0; i < pets.length; i++) {pets[i].eat();if(pets[i] instanceof Dog){// 强转Dog dog = (Dog) pets[i];dog.watchHouse();}else if(pets[i] instanceof Cat){// 强转Cat cat = (Cat) pets[i];cat.catchMouse();}}}
}

通过instanceof可知存在父子关系的类,才能强制类型转换!

为什么需要强制类型转换相关推荐

  1. 自动类型转换和强制类型转换

    自动类型转换: 在Java中,任何情况下,整数类型的字面值默认当成int类型处理 小容量可以自动转换成大容量,这种操作被称为自动类型转换 容量大小的定义: 容量大小不是指数据类型的字节数,而是指这个数 ...

  2. As与强制类型转换的区别以及Is运算符的使用

    前言: 开发人员经常需要将一个对象从一个类型转换成其他类型. 在c#中,类型转换按照转换方式分类分为了隐式转换和显式转换,按对象分类又分为了值类型转换和引用类型转换 CLR(参考:http://bai ...

  3. 重载new、delete和强制类型转换运算符()

    1.重载new和delete运算符 内存管理运算符new.new[].delete和delete[]也可以进行重载,其重载形式既可以是类的成员函数,也可以是全局函数.一般情况下,内建的内存管理运算符就 ...

  4. C++中的向上类型转换和向下类型转换+四种强制类型转换

    转自博客:http://blog.csdn.net/wangweitingaabbcc/article/details/7720979# 在c++的世界中有这样两个概念,向上类型转换,向下类型转换,分 ...

  5. 栈和托管堆/值类型和引用类型/强制类型转换/装箱和拆箱[C#]

    一.栈和托管堆 通用类型系统(CTS)区分两种基本类型:值类型和引用类型.它们之间的根本区别在于它们在内存中的存储方式..NET使用两种不同的物理内存块来存储数据-栈和托管堆.如下图所示:     值 ...

  6. 《你不知道的JavaScript》整理(六)——强制类型转换

    JavaScript中通常分为两种类型转换,"隐式强制类型转换"(implicit coercion)和"显式强制类型转换"(explicit coercion ...

  7. C++编程进阶4(C++中的强制类型转换运算符、不要返回自定义类内部成员的指针,引用和迭代器)

    十五.C++中的强制类型转换 C语言中的强制类型转换方式有两种 T i = (T)exp; T i = T(exp); 这两种方式没有差别,C++中也支持这两种方式,但是和C++中的强制类型转换运算符 ...

  8. static_cast与c风格的强制类型转换比较

    class A {int a; };class B {int b; };class C : public A {int c; };int main() {B b;C c;A* p1 = (A*) &a ...

  9. 初学python-字符串中引号的使用、input简介、强制类型转换、加减乘除简写、条件判断...

    一.字符串中单引号和双引号的使用: 1.字符串以英文单引号' '引用.eg:'Hello World' 2.若字符串中含有单引号,则以英文双引号" "引用.eg:"I'm ...

  10. C语言之强制类型转换与指针--#define DIR *((volatile unsigned int *) 0x0022)

    强制类型转换形式:(类型说明符) (表达式) 举例说明:1) int a; a = (int)1.9; 2)char *b; int *p; p = (int *) b; //将b的值强制转换为指向整 ...

最新文章

  1. 广义互相关计算TDOA
  2. php smeoa,install.php
  3. 模仿Retrofit封装一个使用更简单的网络请求框架
  4. 目标检测之选择性搜索-Selective Search
  5. spring对事务的控制 AOP
  6. opendaylight_使用OpenDaylight在软件中定义网络
  7. java jaxb 集合_java-使用JAXB解组/编组List String
  8. 瑞幸回应申请破产:这是一个让重生之路又进一步的好消息
  9. Java--transient
  10. 一个简单的堆栈,逻辑很清晰
  11. 怎么讲计算机屏幕录制,屏幕录制软件怎么用?教你2种屏幕录制方法
  12. 【胡学长 带你学 Global Mapper 】Global Mapper Pro 23.1 -x64安装教程(附*英*软件包下载)
  13. 解决ASP.NET 安装完成报错500
  14. Tableau同比或环比计算方法
  15. 社会网络分析法SNA
  16. JAVA关键字final修饰类,深入分析java中的关键字final
  17. [基本功练习素材]播音初学者资料—口部操,唇舌力量控制;声母韵母难点练习
  18. Windows 窗口层次关系
  19. itest软件测试工具,Monkey测试工具 - iTest99的个人空间 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...
  20. 爬虫入门之查找JS入口篇(七)

热门文章

  1. arcgis for android(十)地理(电子)围栏实现
  2. python学习-数组
  3. java解析Excel
  4. Pandoc 从入门到精通,你也可以学会这一个文本转换利器
  5. 三天搞定射频识别技术(一)1.2
  6. 使用Jna调用dll函数库(java使用jna对接硬件接口)
  7. 钦州学院计算机好吗,罗雁(数学与计算机科学系)老师 - 钦州学院 - 院校大全
  8. 职场新人如何成为沟通高手
  9. 2019款苹果一体机/笔记本安装/恢复macOS Catalina图文详解
  10. 旋转体体积和平行截面的面积求体积