谈谈强制类型转换

基于three.js的室内全景3D展馆案例分享 3D场景展厅 阅读详情

 

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

引子1:

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

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

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

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

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

引子2:

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

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

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

Animal aninal = 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
Pyradiomics 医学影像提取放射组学特征(下) 阅读详情

相关推荐

新手也能懂的Simulink汽车二自由度建模:从公式推导到模型搭建全流程

本文为新手提供了在Simulink中搭建汽车二自由度模型的完整实战指南。文章从模型核心概念讲起,详细讲解了如何将车辆动力学方程转化为状态空间模型,并逐步指导在Simulink中实现从参数设置、模块搭建到仿真验证的全过程。通过阶跃转向测试和参数影响分析,帮助读者直观理解车辆转向特性,并提供了实用的模型扩展思路与常见问题排查技巧。

weixin_29047919的博客 216

web前端-JavaScript标识符和数据类型/强制类型转换

🐚作者简介:苏凉(专注于网络爬虫,数据分析,正在学习前端的路上) 🐳博客主页:苏凉.py的博客 🌐系列专栏:web前端基础教程 👑名言警句:海阔凭鱼跃,天高任鸟飞。 📰要是觉得博主文章写的不错的话,还望大家三连支持一下呀!!! 👉关注✨点赞👍收藏📂 文章目录字面量变量声明,赋值变量标识符JavaScript数据类型 字面量 一些不可以改变的值,可以直接使用。但不建议使用。一般赋值给变量后引用。 变量 可以改变的值。变量可以用来保存字面量,而且变量的值是可以任意改变的,变量更加方便我们使用,所以在开发中..

苏凉.py的博客 1649

GK2302量产工具下载方法,GK2302开卡教程,GK2301LT怎么开卡方法,附GK2302开卡工具,GK2301LT量产软件下载

​每种量产软件的操作流程可能略有不同,因此必须按照要求操作。为确保安全,建议使用量产部落网下载的原版量产开卡软件。

A520091000的博客 2131

Java的强制类型转换

Java的强制类型转换

weixin_61652218的博客 2万+

Benchmark系列——基本概念和分类

本文主要介绍了Benchmark的基本概念和分类情况。

Bluetangos的博客 8445

MATLAB安装

Matlab 2016a 安装包及破解教程百度云分享链接: 链接:https://pan.baidu.com/s/1i6BgD8p       密码:17gg   Matlab安装教程: 1、下载文件,得到R2016a_win64.part1.rar、R2016a_win64.part2.rar两部分安装文件和Matlab 2016a Win64 Crack破解文件。 2、解压安装文件(解...

qq_36734094的博客 17万+

【Java】强制类型转换

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

chengwei1128的博客 2万+

SQL手工注入及sqlmap注入(文章管理系统实例练习)

sql手工注入及sqlmap注入练习

weixin_53303754的博客 524

Java基础——类型转化(强制转化)

显式类型转换发生在程序员需要将一个较大的数据类型转换为较小的数据类型时,或者在不兼容的类型之间进行转换时。指的是将父类类型的对象引用强制转换为子类类型的对象引用。这种转换是有风险的,只有在确保父类对象实际指向的是子类实例时,才能安全地进行。隐式类型转换发生在较小的数据类型被赋值给较大的数据类型时,Java编译器会自动处理这种转换,而不需要程序员显式地指定。向下转型常用于多态性场景中,当你想调用子类特有的方法或访问子类特有的属性时,就需要将父类引用转换为子类引用。(2)显式类型转换(强制类型转换)

2301_78566776的博客 1648

大模型呼叫中心场景分享之六:大模型外呼IT运维告警——智能监控与自动化响应的未来

在数字化运维(IT Operations)中,实时监控系统健康状态并及时响应告警是保障业务连续性的关键。传统的IT告警方式(如邮件、短信、钉钉/企业微信通知)存在信息过载、响应延迟、人工处理效率低等问题。而大模型(LLM)与语音技术(TTS/ASR)的结合,为IT运维告警提供了更智能的解决方案——大模型外呼告警系统。大模型外呼告警系统正在重新定义IT运维的效率和体验。通过实时语音交互+智能自动化,企业能够将平均故障修复时间(MTTR)从小时级缩短至分钟级。

开源呼叫中心系统FreeIPCC的博客 925

Open Dynamics Engine(ODE)物理引擎教程(1)--下载与安装准备

引言 ODE是一个免费的工业级库,用于模拟关节式刚体动力学,例如地面车辆、腿部生物和虚拟现实环境中的移动对象。它具有快速、灵活、健壮和独立于平台的特点,具有先进的关节、摩擦接触和内置的碰撞检测功能。 项目主页:http://www.ode.org/ 线上手册:http://ode.org/wiki/index.php?title=Manual 本教程为博主亲自亲测过程的总结,转载请注明出处! ...

腿足机器人领域 2216

JAVA类型强制转换

Java类型强制转换 ...

miracleon的博客 1万+

向华为学习——解读158页 华为敏捷园区网技术解决方案【附全文阅读】

华为敏捷园区网解决方案通过策略随行和体验随身技术,满足移动办公场景下的网络需求。该方案采用敏捷交换机和防火墙自动执行策略配置,实现用户身份认证与业务策略的无缝衔接,且策略配置与IP地址解耦,简化了管理流程。相比传统技术,该方案有效解决了用户分级、QoS保障、无线接入等关键问题,确保用户在移动过程中获得一致的网络体验。

cdfunlove的博客 381

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

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

itpeilibo的博客 242

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

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

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

amenga123的博客 536

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

详解强制类型转换

今天谈谈类型转换的问题吧,之前我们也遇到过类型转换,比如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 锁屏 相关源码待公开

谈谈 JavaScript 中的类型转换机制

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

家有呆喵~的博客 295

谈谈C++的类型转换。

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

韩思远的专栏 654

强制类型转换之困思

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

william_djj的专栏 165

前端面试题——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
上一篇: 动笔帮助我们记忆
下一篇: 实践1:编写日历(日期类的用法)——可以当成面试题
老李-大连
博客等级 码龄20年 3206粉丝 308原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值