课时76:对象向下转型

简介: 向下转型的主要特点在于需要使用到一些子类自己特殊的定义处理。1.向下转型的介绍2.实现向下转型3.向上转型和向下转型的联系

课时76:对象向下转型

 

摘要:向下转型的主要特点在于需要使用到一些子类自己特殊的定义处理。

1. 向下转型的介绍

2. 实现向下转型

3. 向上转型和向下转型的联系

 

01. 向下转型的介绍

 

例如我此时想定义一个动物,动物是一个很大的范围,动物下包含了很多,例如狗、人等。那么在人这么一个类里面,它规定的应该是一些人的具体描述。人这一类中有包含很多,例如超人等。 那图中的小强是超人吗?

image.png

超人除了会飞等特征之外,和人是一样的。若现在有一个很可怕的情况,那应该派小强去还是小高去?那次是我们应该派一个较能打的,此时包含了能打的特指,那我们就应该排超人小高出面。


根据以上例子,可以总结出我们什么情况下需要向下转型,我们发现父类中没有的功能时,就需要向下转型。

 

02. 实现向下转型

 

假如正常情况下我们来写一个操作代码,一个人可能会有一些基础信息,随便写一个叫 Print(),加上一个正常的人类行为,吃饭、睡觉、繁衍。


再找一个超人,具备人类的全部的功能,还有额外的可以飞、可以喷火的功能。正常情况下,超人混入在普通人中,我们看得出来吗?我们看不出来,所以正常情况下,超人就是一个人,这个时候,我们就称之为向上转型。正常状态下的超人应该是一个普通人的状态。


代码如下:

class Person {
    public void print() {
        System.out.println("一个正常的人类行为,吃饭、睡觉、繁衍。");
    }
}
class SuperMan extends Person {
    public String fly() {
        return "我可以飞。。。";
    }
    public String fire() {
        return "我可以喷火。。。";
    }
}

image.png

image.png

编译结果为:

image.png

 

如果我们现在假设外星怪兽狗骚扰地球,准备消灭人类,此时,超人还能当普通人吗?并不能。此时应该发挥超人的功能:

代码如下:

System.out.println("----------- 外星怪兽狗骚扰地球,准备消灭人类 -----------");
SuperMan man = (SuperMan) per;  // 向下转型
System.out.println(man.fly());
System.out.println(man.fire());


image.png

编译结果为:

image.png

正常情况下,超人是个普通人。如果殊情况出现,则超人的功能会发挥出来。

 

03. 向上转型与向下转型的联系

 

由以上示例可知,向上转型描述的是一些公共的特征,而向下转型描述的是子类自己特殊的定义环境。这也是向下转型存在的意义。


但是我们需要明确的是,向下转型并不是一件安全的事情。因为在进行向下转型之前,一定要首先发生向上转型。


例如接以上示例,当世界遇上危机,一个普通人站出来说自己是超人:

image.png

此时,普通人小强并不能承受住怪兽带来的攻击。

范例:(并未进行向上转型)观察错误的程序

代码如下:

public String fire() {
    return "我可以喷火。。。";
}
 
public class JavaDemo {
    public static void main(String args[]) {
System.out.println("--------------------------- 正常状态下的超人应该是一个普通人的状态 ---------------------------");
        Person per = new Person(); // 不转型
        per.print();
        System.out.println("----------- 外星怪兽狗骚扰地球,准备消灭人类 -----------");
    }
}

image.png

编译结果为:

image.png

正常的状态的超人应该是一个普通人的状态,可一旦有怪兽,就像小强,只是个普通人,在此情况下直接上战场,此时的 SuperMan类与 Person类有联系吗?答案是并没有。

代码如下:

public class JavaDemo {
    public static void main(String args[]) {
System.out.println("--------------------------- 正常状态下的人应该是一个普通人的状态 ---------------------------");
        Person per = new Person(); // 不转型
        per.print();
System.out.println("--------------------------- 外星怪兽狗骚扰地球,准备消灭人类 ---------------------------");
        SuperMan man = (SuperMan) per; // SuperMan类与Person类向下转型
    }
}

image.png

此时的运行结果为:

image.png

可见,此时的代码出现了一个严重的错误,Person并不能变成 SuperMan。因为小强的本质只是一个普通人。


所以,以后只要是发生对象的向下转型之前一定要首先发生向上转型,两个没有任何关系的实例如果要发生强制转换,那么就会出现 “ClassCastException”异常,所以向下转型并不是一件安全的事情。


且向下转型并不是一个常用的概念,但是要明确向下转型的主要目的是为了调用子类的功能,所以在此之前一定要向上转型。

相关文章
|
10月前
|
存储 数据安全/隐私保护 开发者
苹果app上架app store 之苹果开发者账户在mac电脑上如何使用钥匙串访问-发行-APP发布证书ios_distribution.cer-优雅草卓伊凡
苹果app上架app store 之苹果开发者账户在mac电脑上如何使用钥匙串访问-发行-APP发布证书ios_distribution.cer-优雅草卓伊凡
536 8
苹果app上架app store 之苹果开发者账户在mac电脑上如何使用钥匙串访问-发行-APP发布证书ios_distribution.cer-优雅草卓伊凡
|
Java 程序员 调度
【JAVA 并发秘籍】进程、线程、协程:揭秘并发编程的终极武器!
【8月更文挑战第25天】本文以问答形式深入探讨了并发编程中的核心概念——进程、线程与协程,并详细介绍了它们在Java中的应用。文章不仅解释了每个概念的基本原理及其差异,还提供了实用的示例代码,帮助读者理解如何在Java环境中实现这些并发机制。无论你是希望提高编程技能的专业开发者,还是准备技术面试的求职者,都能从本文获得有价值的见解。
242 1
|
9月前
|
机器学习/深度学习 传感器 人工智能
《AI领航:解锁机器人分布式智能控制的奥秘》
机器人分布式智能控制技术正推动多机器人协同作业迈向新高度。借助人工智能,特别是多智能体强化学习(MARL)和分布式深度学习,机器人可自主学习、优化决策并高效协作。在仓储物流、智能工厂及灾难救援等场景中,机器人通过实时通信与数据共享完成复杂任务。然而,随着系统规模扩大,通信成本与计算负担增加,需引入联邦学习等方法保障数据隐私与可靠性。同时,环境感知与决策融合技术解决信息不确定性问题,提升整体性能。这一领域的持续创新将为机器人协作开辟更广泛的应用前景。
177 0
|
缓存 监控 Linux
服务器中常用的几个资源监控工具整理
【4月更文挑战第2天】服务器中常用的几个资源监控工具整理
1143 13
|
Java 测试技术 开发者
Java零基础-indexOf(String str)详解!
【10月更文挑战第13天】Java零基础教学篇,手把手实践教学!
411 1
|
消息中间件
消息中间件系列教程(15) -RabbitMQ-基于全局消息ID解决幂等性问题
消息中间件系列教程(15) -RabbitMQ-基于全局消息ID解决幂等性问题
311 0
|
机器学习/深度学习 存储 数据采集
Elasticsearch 与机器学习的集成
【9月更文第3天】Elasticsearch 不仅仅是一个强大的分布式搜索和分析引擎,它还是一个完整的数据平台,通过与 Kibana、Logstash 等工具结合使用,能够提供从数据采集、存储到分析的一站式解决方案。特别是,Elasticsearch 集成了机器学习(ML)功能,使得在实时数据流中进行异常检测和趋势预测成为可能。本文将详细介绍如何利用 Elasticsearch 的 ML 功能来检测异常行为或预测趋势。
562 4
|
JavaScript Java 测试技术
基于SpringBoot+Vue个人博客系统设计和实现(源码+LW+部署讲解)
基于SpringBoot+Vue个人博客系统设计和实现(源码+LW+部署讲解)
263 7
|
存储 前端开发 API
前端开发中,Web Storage的存储数据的方法localstorage和sessionStorage的使用及区别
前端开发中,Web Storage的存储数据的方法localstorage和sessionStorage的使用及区别
522 0
|
Java
java 发邮件带excel附件,以流的形式发送附件,不生成excel文件
java 发邮件带excel附件,以流的形式发送附件,不生成excel文件
1237 0

热门文章

最新文章