谈谈强制类型转换

强制类型转换在Java中大量使用,与继承、接口实现、多态都相关,非常重要,如果没有强制类型转换,很多功能可能都没有办法实现。而在实际使用过程,对它的理解和使用总是有一些误解,下面对它进行比较详细的分析。首先看看两个场景。

引子1:

在课堂上问过学生这样一个问题:“在Java中如何把一个表示数字的字符串转换成数字呢?”

在不同的班级中有多个同学回答:“使用强制类型转换”

我继续问,“代码如何写?”

有的学生答“int i = (int) s”,s是字符串,有的学生答“int i = Integer.parseInt(s)”

前者写的是强制类型转换的代码,但是是错误的,而后者是对的,但是不是强制类型转换。

引子2:

在指导学生实训的时候,很多时候要使用工具类List或者Map,因为List或者Map中可以存储任何类型的数据,所以取出数据之后需要转换成需要的类型,学生这时候把强制类型转换理解成是万能的,想把结果转换成什么类型就转换成什么类型。其实这种想法是错误的,并且有这种想法的人还很多。

“强制类型转换”,从字面上看,就是把一个类型强制转换成另外一个类型。是不是这样呢?在Java中,对象的实例化是根据类型来的,也就是说对象在创建的时候类型就已经确定了,是不能变化的。

那“强制类型转换”是怎么回事呢?实际上,这里说的类型转换是把一种类型的对象引用指向另一种类型的引用指向的对象实例。例如:

Animalaninal = new Dog();

Dog dog = (Dog)animal;

第1行把aninal指向Dog的实例(通过new实例化),第2行让Dog类型的对象引用dog指向Aninal类型的animal引用所指向的实例。实际上这里并没有发生什么类型转换,因为animal本身指向的就是一条狗,所以把dog指向了animal指向的实例,也就是把dog指向了一条狗。真的没有类型转换!!!

为什么需要这样的语法呢?生活中,我们看到一条狗会说这是一条狗(Dog dog=new Dog()),看到一只猫会说这是一只猫(Cat cat=new Cat())。但是有时候,当我们看到一条狗的时候,我们会说这是一个动物(实际上这个动物是一条狗,Animal animal=new Dog()),然后你可能会说这只动物是狗。就像你给小孩讲故事,“大树下面有一只动物,它是一条狗”。但是我们知道动物它不一定就是狗,如果你认为它是一条狗,就用强制类型转换吧,其实就是声明一下这个动物真的是狗(Dog dog=(Dog)animal)。

会不会有这样的情况呢?你看走了眼,它不是狗而是狗科的狼。如果是这样,程序在编译的时候不会抱错,但是在运行的时候就会出错了,就是著名的ClassCastException。下面是一个典型的例子:

Aninal animal = new Cat();

Dog dog = (Dog)aninal;

从语法上没有错误,但是因为你看走眼了,运行时就错了。当然这样的走眼应该不会发生,什么时候会发生这样的错误呢?你调用了某个方法返回了一个Animal,你理所当然就认为它是Dog,就转换成了Dog,如果它不是Dog,就会出错了。如果你肯定它就是Dog就可以这样做,如果不确定怎么办呢?

首先,判断是不是Animal,因为它可能什么都不是,是null。

其次,使用instanceof判断它的类型,然后再处理:

if animal instanceof Dog

Dog dog = (Dog)animal;

不知道你对强制类型转换的作用理解了没有,简单的记住下面的话:

要想把一只动物转换成为狗,首先它必须是狗。强制类型转换就是要告诉编译器它确实是一条狗。

李绪成 优快云 Blog : http://blog.youkuaiyun.com/javaeeteacher
【AUTOSAR-E2E】-2.1-配置E2E:基于E2EPW配置一个RX接收的Signal Group(使用E2E Profile 2) 《共13页精讲》:此法也适用于E2E Profile 4/5/6/7/11/22 目录 1 检查CAN Matrix Arxml/DBC是否满足E2E需求 2 在DaVinci Developer中为Port添加E2E保护 3 在DaVinci Configurator settings设置 4 如何使用应用层的E2E保护 5 结尾 <--返回「Autosar_BSW高阶配置」总目录--> <--返回「Autosar_BSW高阶配置」专栏主页--> <-- 阅读详情

相关推荐

海康Camera MVS Linux SDK二次开发封装ROS packge过程记录(c++)

https://www.hikrobotics.com/machinevision/service/download?module=0

weixin_41965898的博客 2万+

Java强制类型转换

基本数据类型和引用数据类型的强制类型转换

qq_52240237的博客 3168

agv调度系统3.0技术介绍

agv调度系统,穿梭车调度系统,调度系统技术介绍,教你做调度

持续分享调度系统开发过程 4869

Java强制类型转换的所有规则都在这里了

`long`类型内存8个字节, `int`类型内存4个字节。 `long`取值范围大于`int` ;想要赋值成功,只有通过**强制类型转换**,将 `long` 类型强制转换成`int`类型才能赋值。 - **强制转换**:将 **取值范围大的类型 强制转换成 取值范围小的类型**;比较而言,**自动转换是Java自动执行的,而强制转换需要我们自己手动执行。**

緑水長流*z 9910

PLC编程入门基础知识

PLC即为可编程逻辑控制器,实质是一种专用于工业控制的计算机,其硬件结构基本上与微型计算机相同。

SANRENYIXING的博客 2万+

国内开发者福音:手把手教你用微软Authenticator搞定GitHub 2FA验证(附Recovery Codes保存指南)

本文详细介绍了国内开发者如何使用微软Authenticator中国版轻松配置GitHub双重身份验证(2FA),解决短信验证不可用和国际验证器访问困难的问题。重点强调了恢复码(Recovery Codes)的安全备份策略,确保账户安全无忧。

weixin_28840143的博客 437

类型转换在JavaWeb中的应用浅析

类型转换是将某种数据类型的数据(数值、表达式的值或引用)赋值给不同于初始类型的变量。在实际开发中,我们可以根据不同的需求将数据类型转换分为:①基本数据类型间的转换;②引用数据类型间的转换;③基本数据类型与引用数据类型间的相互转换。

weixin_56443856的博客 618

7、Python高光谱分析工具(PyHAT)简介

Python高光谱分析工具(PyHAT)是一个开源、跨平台的Python库及图形用户界面,用于行星光谱数据的可视化与分析。它支持多种高光谱传感器数据,如火星勘测轨道飞行器的CRISM、月船1号的M3以及SELENE Kaguya SP点光谱仪,提供预处理、衍生产品生成、统计学习和机器学习分析功能。PyHAT基于Pandas和NumPy构建,兼容Jupyter和QGIS环境,旨在解决现有光谱分析方法缺乏开源实现、难以探索性分析和算法分散的问题。其模块化架构涵盖数据输入/输出、通用光谱变换、测绘与点观测工具及高

aa123的博客 140

Java的强制类型转换

Java的强制类型转换

weixin_61652218的博客 2万+

DeepFashion 服装识别:基于 YOLOv10 的深度学习实现与 UI 界面开发

随着深度学习的发展,目标检测算法在服装识别任务中表现出色,特别是 YOLO(You Only Look Once)系列模型。服装识别(Fashion Recognition)是计算机视觉领域的重要任务,广泛应用于。已提供,可用于服装分类、款式识别、虚拟试衣等应用。训练服装识别模型,并开发。

YOLO 803

PCL点云处理之计算点到空间直线距离的四种方法(二十三)

PCL点云处理之计算点到空间直线距离的四种方法

weixin_44329757的博客 3022

【Java】强制类型转换

文章目录1. 基本概念2. 应用场景3. 使用风险4. 使用规则5. 训练 1. 基本概念 强制类型转换,可以理解为自动类型转换的逆过程。是将大容量的数据类型转换为小容量的数据类型。 使用时,前面要加上强制类型转换符号()。 2. 应用场景 需要将数据从高精度数据类型转换为低精度数据类型。(即高精度类型的数据不能直接赋值给低精度数据) 【注】Java中数据类型的精度从低到高的顺序为: byte short int long float double 3. 使用风险 程序中使用强制类型转换,可能面临以下2

chengwei1128的博客 2万+

HarmonyOS 鸿蒙开发DevEco Studio OpenHarmony:安全测试

通过对HarmonyOS应用生命周期建模和应用攻击面建模,采用静态数据流分析技术,提高漏洞发现的准确率,同时覆盖20余种攻击面,65+漏洞测试项,帮助开发者提前发现和识别漏洞隐患。在检测报告中,会针对每一项漏洞风险项给出明确的修复建议,可以帮助开发者快速修复漏洞。

斌擎科技 1183

(每日一题)面试官:谈谈 JavaScript 中的类型转换机制

前面我们讲到,JSundefined、null、boolean、string、number、symbolobject但是我们在声明的时候只有一种数据类型,只有到运行期间才会确定当前类型let x = y?1 : a;上面代码中,x的值在编译阶段是无法获取的,只有等到程序运行时才能知道虽然变量的数据类型是不确定的,但是各种运算符对数据类型是有要求的,如果运算子的类型与预期不符合,就会触发类型转换机制强制转换(显示转换)自动转换(隐式转换)

itpeilibo的博客 242

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

谈谈数据类型的间的自动转换和强制转换

#谈谈数据类型的间的自动转换和强制转换 ##自动转换 ##强制转换 ##数据溢出及解决办法

amenga123的博客 533

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

详解强制类型转换

今天谈谈类型转换的问题吧,之前我们也遇到过类型转换,比如c语言中这样的赋值: 显然,i和j是不同类型的变量,但是却可以完成赋值,结果是这样的: 其实它们是做了隐式的类型转换,相当于:double j = (double)i;所以成功的赋值。 还有另外一种: 结果是: 像这样的,属于显示的类型转换。 这样类似的还有很多。下面我介绍c++中几种特殊的类型转换

xxpresent的博客 1158

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

谈谈C++的类型转换。

学习C++已经很久了,由于工作原因,很长一段时间没有用了,再加上经常用一些脚本语言,使得对C++的一些概念,反而有些混乱。所以这里我跟大家一起讨论一下C++的类型转换。如文章中有任何纰漏,还请指正。   众所周知,在PYTHON和其他一些脚本语言中,声明变量是不需要指定类型的。 a=5b="hello"   但是在C++中这样声明变量,显然是不能通过编译的。需要指定变量的类型: int a=

韩思远的专栏 654

谈谈 JavaScript 中的类型转换机制

谈谈 JavaScript 中的类型转换机制 一、概述 JS中有六种简单数据类型:undefined、null、boolean、string、number、symbol,以及引用类型:object 但是我们在声明的时候只有一种数据类型,只有到运行期间才会确定当前类型 let x = y ? 1 : a; 上面代码中,x的值在编译阶段是无法获取的,只有等到程序运行时才能知道 虽然变量的数据类型是不确定的,但是各种运算符对数据类型是有要求的,如果运算子的类型与预期不符合,就会触发类型转换机制 常见的类型转换

家有呆喵~的博客 294

强制类型转换之困思

以前不明白这句话,c语言能让程序员为所欲为。这里谈谈一点体会,c语言之所以强大,很重要的一点是c的强制类型转换,这使得程序员能够突破原来定义的类型而操作内存中额外的部分。这里的“强制类型转换”,以前因为人云亦云自己也这样说,今天看来确实不太恰当,容易造成日后的误解。看一段代码:        char *p = (char *)malloc(1024);        memset(p, 0, 1...

william_djj的专栏 164

前端面试题——14.谈谈强制转换和隐式转换

强制类型转换 常见强制转换主要是Number,Boolean,String这三个函数 1.Boolean()函数 只有这五种情况是false,其它情况都为true undefined null -0或+0 NaN ‘’(空字符串) 至于null是“对象”Boolean却返回false的,可以看这里 2.Number()函数 下面分成两种情况讨论,一种是参数是原始类型的值,另一种是参数是对象。 ...

qq1722377628的博客 479

关于指针强制类型转换的思考

说不上是思考,只是想谈谈自己对指针的强制类型转换的理解。之所以写出来,一方面是自己做一个笔记,另一方面也可以和大家探讨探讨,更重要的也是向大家学习。以前总是记不住指针的强制类型转换的格式,归根结底还是自己对这个知识点不够理解。   什么是指针变量   指针变量,本质上是一

zwx5225的专栏 599

JavaScript显式类型转换与隐式类型转换

本文谈谈JavaScript的类型转换,我们知道在JavaScript中声明变量不需指定类型, 对变量赋值也没有类型检查,同时JavaScript允许隐式类型转换。这些特征说明JavaScript属于弱类型的语言。 在强类型的C++中,多数情况下构造函数需要声明为explicit来避免隐式类型转换引起的误用 (见Item 15:资源管理类需要提供对原始资源的访问)。 弱类型的语言中类

分享技术,共建开放平台 1万+

面试官:谈谈 JavaScript 中的类型转换机制

一、概述JS中有六种简单数据类型:undefined、null、boolean、string、number、symbol,以及引用类型:object但是我们在声明的时候只有一种数据类型,只...

weixin_44475093的博客 1107
上一篇: 为“得”而“舍”
下一篇: 学习编程的4项基本功:看、动手、思考、问
Java_Web_Book
博客等级 码龄18年 8粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值