网站首页 > java教程 正文
难度
初级
学习时间
30分钟
适合人群
零基础
开发语言
Java
开发环境
- JDK v11
- IntelliJ IDEA v2018.3
提示
本教学属于系列教学,内容具有连贯性,本章使用到的内容之前教学中都有详细讲解。
1.向上转型
对象既可以作为它自己本身的类型使用,例如:
也可以作为它的父类型使用,例如:
我们把对某个对象的引用视为对其父类型的引用的做法称作向上转型。
Student的继承树:
可以形象的看到Student箭头指向上方。
2.对象既可以作为它自己本身的类型使用
演示:
对象既可以作为它自己本身的类型使用。
代码:
People类:
Student类:
Main类:
结果:
从运行结果可以看到,我们子类重写了从父类继承而来但sayHi方法,显示输出的是“Student sayHi”。
3.对象也可以作为它的父类型使用
演示:
对象也可以作为它的父类型使用。
代码:
People类:
Student类:
Main类:
结果:
从运行结果可以看到,虽然将对象作为父类类型使用,但是实际运行的确实对象中的方法。父类类型是People,实际运行的对象类型是Student,所以在运行时执行的是Student对象里面的sayHi方法。
我们的父类中只有sayHi方法,没有sayHello方法,所以我们不能去调用sayHello方法。假如我们去调用sayHello方法会怎样:
结果:
错误信息:
文字版:
/Users/admin/Workspace/Java/Hello/src/main/Main.java
Error:(22, 15) java: 找不到符号
符号: 方法 sayHello()
位置: 类型为lab.People的变量 people
在类型为People的类里面找不到一个叫sayHello的方法,因为sayHello方法定义在子类Student类里面,父类People找不到这个方法很正常。所以,无论是子类还是父类,编译时总是看的引用类型,如果引用类型是子类,那么看的是子类中是否有该成员;如果引用类型是父类,那么看父类中是否有该成员。
疑问:什么叫引用类型?
左边的叫引用,左边的类型叫引用类型。例如,student叫引用,People叫引用类型:
4.向下转型
对象既可以作为它自己本身的类型使用,例如:
但不可以作为它的子类型使用,例如:
我们把对某个对象的引用视为对其子类型的引用的做法称作向下转型。
Student的继承树:
可以形象的看到Student箭头指向上方。向下转型就是People指向Student。
5.向下转型:对象既可以作为它自己本身的类型使用
演示:
对象既可以作为它自己本身的类型使用。
代码:
People类:
Student类:
Main类:
结果:
从运行结果可以看到,父类People类型指向People对象,调用sayHi方法是父类People类里面的,所以运行结果完全正确。
6.向下转型:对象不可以作为它的子类型使用
演示:
对象不可以作为它的子类型使用。
代码:
People类:
Student类:
Main类:
结果:
错误信息:
文字版:
/Users/admin/Workspace/Java/Hello/src/main/Main.java
Error:(12, 13) java: 不兼容的类型: lab.People无法转换为lab.Student
从运行结果可以看到,我们父类People无法转换为子类Student。
打个比方,我们可以说“猫和狗都是动物”,但不能说“动物都是猫和狗”。
向上转型是安全的,但向下转型是不安全的。
7.类型转换
在Java中,可以通过在引用前写上小括号(),然后在小括号里面需要转换为目标类型即可:
8.类型判断instanceof
有时候,我们需要在类型转换前先判断对象类型,类型判断使用instanceof关键字:
当student对象为People类型时,执行if语句体。
总结
- 对象既可以作为它自己本身的类型使用,也可以作为它的父类型使用。
- 把对某个对象的引用视为对其父类型的引用的做法称作向上转型。
- 把对某个对象的引用视为对其子类型的引用的做法称作向下转型。
- 向上转型是安全的,但向下转型是不安全的。
- 在Java中,可以通过在引用前写上小括号(),然后在小括号里面需要转换为目标类型即可。
- 有时候,我们需要在类型转换前先判断对象类型,类型判断使用instanceof关键字。
至此,Java中向上转型和向下转型相关内容讲解先告一段落,更多内容请持续关注。
答疑
如果大家有问题或想了解更多前沿技术,请在下方留言或评论,我会为大家解答。
上一章
下一章
“全栈2019”Java第五十四章:多态详解
学习小组
加入同步学习小组,共同交流与进步。
- 方式一:关注头条号Gorhaf,私信“Java学习小组”。
- 方式二:关注公众号Gorhaf,回复“Java学习小组”。
全栈工程师学习计划
关注我们,加入“全栈工程师学习计划”。
版权声明
原创不易,未经允许不得转载!
猜你喜欢
- 2024-10-11 SpringBoot整合Nacos配置中心加载原理二
- 2024-10-11 Java核心修饰符——abstract修饰符与抽象类、抽象方法
- 2024-10-11 绝对的JAVA面试干货(java juc 面试)
- 2024-10-11 Java面试集合(三)-1(基础篇java集合面试专用)
- 2024-10-11 Java之路-10 API、Scanner类、Random类、Math类
- 2024-10-11 JAVA面试基础知识点(java面试必背)
- 2024-10-11 java面试题及答案2022,java2022最新面试题及答案
- 2024-10-11 java向上转型和向下转型(java向上转型调用的是子类还是父类属性)
- 2024-10-11 「Java基础11」常用API(java基础知识点整理汇总)
- 2024-10-11 java基础总结(java基础总结心得)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)