6.3对象类型的转换

对象类型的转换在Java编程中经常遇到,主要包括向上转型与向下转型操作。本节将详细讲解对象类型转换的内容。

6.3.1向上转型

向上转型可以被理解为将子类类型的对象转换为父类类型的对象,即把子类类型的对象直接赋值给父类类型的对象,进而实现按照父类描述子类的效果。

【例1】tom是谁?

使用向上转型模拟如下场景:这里有一个人,他叫tom,他是一名教师。

class People{}

class Teacher extends People{}

public class Demo3{

public static void main(String[]args){

People tom =new Teacher();

}

}

在上述代码中,"People tom = new Teacher();"运用了向上转型的语法,那么该如何理解这行代码的含义呢?

People tom = new Teacher();

这里有一个人 名叫tom tom是一名教师

综上所述,因为人类(People)是教师类(Teacher)的父类,所以通过向上转型,能够把教师类(Teacher)类型的对象(new Teacher();)直接赋值给人类(People)类型的变量(tom)。也就是说,进行向上转型,父类类型的对象可以引用子类类型的对象。而且,向上转型是安全的,因为向上转型是将一个较具体的类的对象转换为一个较抽象的类的对象。例如,可以说平行四边形是四边形,但不能说四边形是平行四边形。

那么,使用向上转型的过程中,父类的对象是否可以调用子类独有的属性或者方法呢?下面以父类四边形类的对象调用子类平行四边形类独有的属性为例,阐述这一问题。

例如,四边形类是平行四边形类的父类,用Quadrangle表示四边形类、用Parallelogram表示平行四边形类;在Parallelogram类中,定义一个值为4的表示底边长度的变量edges;在Parallelogram类的主方法中,运用向上转型,把平行四边形类(Parallelogram)类型的对象直接赋值给四边形类(Quadrangle)类型的对象。人为强制四边形类(Quadrangle)类型的对象可以调用变量edges,并将edges的值修改为6,Eclipse能通过编译么?Eclipse在相关代码处显示波浪线等错误标志,说明代码有误。

综上所述,在运用向上转型的过程中,父类的对象无法调用子类独有的属性或者方法。

6.3.2 向下转型

向下转型可以被理解为将父类类型的对象转换为子类类型的对象。但是,运用向下转型,如果把一个较抽象的类的对象转换为一个较具体的类的对象,这样的转型通常会出现错误。例如,可以说某只鸽子是一只鸟,却不能说某只鸟是一只鸽子。因为鸽子是具体的,鸟是抽象的。一只鸟除了可能是鸽子,还有可能是老鹰、麻雀等。因此,向下转型是不安全的。

【例2】谁是鸽子?

编写代码证明"可以说某只鸽子是一只鸟,却不能说某只鸟是一只鸽子":鸟类是鸽子类的父类,用Bird表示鸟类,用Pigeon表示鸽子类。

class Bird{}

class Pigeon extends Bird{}

public class Demo4{

public static void main(String[]args){

Bird bird = new Pigeon(); //某只鸽子是一只鸟

Pigeon pigeon = bird; //某只鸟是一只鸽子

}

}

本例在运行之前,Eclipse会报出编译错误,这是因为父类对象不能直接赋值给子类对象。

如果想要告诉编译器"某只鸟就是一只鸽子",应该如何修正?答案就是强制类型转换。也就是说,要想实现向下转型,需要借助强制类型转换。语法如下:

子类类型 子类对象 = (子类类型)父类对象;

因此,要想实现把鸟类对象转换为鸽子类对象(相当于告诉编译器"某只鸟就是一只鸽子"),需要将代码修改为:

Pigeon pigeon = (Pigeon)bird; //通过强制类型转换,告诉编译器"某只鸟就是一只鸽子"
注意:

(1)两个没有继承关系的对象不可以进行向上转型或者向下转型。

(2)父类对象可以强制转换为子类对象,但有一个前提:这个父类对象要先引用这个子类对象。

如果把上述实例中的代码:

Bird bird = new Pigeon(); //某只鸽子是一只鸟

Pigeon pigeon = (Pigeon)bird; //通过强制类型转换,告诉编译器"某只鸟就是一只鸽子"

修改为如下代码:

Bird bird = new Bird(); //某只鸽子是一只鸟

Pigeon pigeon = (Pigeon)bird; //通过强制类型转换,告诉编译器"某只鸟就是一只鸽子"

虽然Eclipse没有提示编译错误,但运行程序后,控制台将输出如下错误信息:

Exception in thread "maln"java.lang ClassCastException:class Bird cannot be cast to class Pigeon

相关推荐
四谎真好看2 小时前
Java 黑马程序员学习笔记(进阶篇27)
java·开发语言·笔记·学习·学习笔记
报错小能手2 小时前
C++笔记 仿函数(函数对象)
开发语言·c++·笔记
草莓熊Lotso2 小时前
《算法闯关指南:优选算法--模拟》--39.替换所有问号,40.提莫攻击
开发语言·c++·算法·模拟
q***82912 小时前
Spring Boot 热部署
java·spring boot·后端
合作小小程序员小小店2 小时前
web开发,在线%农业产品销售管理%系统,基于idea,html,css,vue.js,layui,java,jdk,ssm
java·前端·jdk·intellij-idea·layui·数据库管理员
草莓熊Lotso3 小时前
C++ STL set 系列完全指南:从底层原理、核心接口到实战场景
开发语言·c++·人工智能·经验分享·网络协议·算法·dubbo
珹洺3 小时前
Java-Spring实战指南(三十四)Android Service实现后台音乐播放功能
android·java·spring
咖啡の猫5 小时前
搭建Python开发环境
开发语言·python
微学AI6 小时前
Rust语言的深度剖析:内存安全与高性能的技术实现操作
java·安全·rust