专业的JAVA编程教程与资源

网站首页 > java教程 正文

“全栈2019”Java第五十三章:向上转型和向下转型详解

temp10 2024-10-11 18:20:34 java教程 15 ℃ 0 评论

难度

初级

学习时间

30分钟

“全栈2019”Java第五十三章:向上转型和向下转型详解

适合人群

零基础

开发语言

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第五十二章:继承与初始化详解

下一章

“全栈2019”Java第五十四章:多态详解

学习小组

加入同步学习小组,共同交流与进步。

  • 方式一:关注头条号Gorhaf,私信“Java学习小组”。
  • 方式二:关注公众号Gorhaf,回复“Java学习小组”。

全栈工程师学习计划

关注我们,加入“全栈工程师学习计划”。

版权声明

原创不易,未经允许不得转载!

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表