当前位置: 首页 > news >正文

Java 数据类型转换详解:隐式转换(自动转换)与强制转换(手动转换)

目录

前言

取值范围从小到大的关系:

隐式转换(自动转换)

📜示例 1:基本类型隐式转换

📜示例 2:算术运算中的类型提升

📜示例 3:byte、short 和 char 的自动转换

隐式转换支持的基本类型:

强制转换(显式转换)

📜示例 1:浮点数到整数的强制转换

📜示例 2:超出范围的强制转换

强制转换常见的类型:

复杂类型中的转换

📜示例 1:子类向父类的隐式转换(多态)

📜示例 2:父类向子类的强制转换

🔴类型转换中的注意事项

🌷结论🌷


🔺在 Java 编程中,数据类型转换是非常常见的操作,分为:

  • 🍃隐式转换(自动转换)
  • 🍃强制转换(手动转换)

🔺理解这些转换将帮助你更好地控制程序中的数据处理。本文将深入讲解这两类转换,并提供稍复杂一些的示例,帮助你逐步掌握这个概念。

前言

我们可以把不同类型的数据看作不同大小的容器。

🔺例如,把一杯水(较小的数据类型)倒进大水壶(较大的数据类型)很轻松,但把一大壶水倒进小杯子就不容易,可能会溢出。

🔖这就是 Java 中数据类型转换的本质:

  • 当我们从小容器倒入大容器时是安全的(隐式转换)
  • 而从大容器倒入小容器时需要特别小心(强制转换)。

🔖在学习之前,先了解一下Java基本数据类型的大小关系

取值范围从小到大的关系:

byte < short < int < long < float < double


隐式转换(自动转换)

🔺隐式转换是指在不需要显式声明的情况下,Java 自动将一种较小的类型转换为较大的兼容类型。

就像从小杯子往大水壶里倒水,不用担心溢出,Java 也能保证这种转换不会出现数据丢失

📜示例 1:基本类型隐式转换

int a = 50;
double b = a; // int 自动转换为 double
System.out.println(b); // 输出 50.0

解释:double 类型比 int 类型大,int 类型的 a 自动转换为 double 类型,Java 自动完成了这种安全的转换。

📜示例 2:算术运算中的类型提升

当你在表达式中混合使用不同类型的变量时,Java 会自动将较小类型提升为较大类型进行运算

int num1 = 10;
double num2 = 5.5;
double result = num1 + num2; // int 自动转换为 double
System.out.println(result); // 输出 15.5

解释: 在这个表达式中,num1int 类型,但由于 num2double,所以 num1 自动提升为 double 以便两者可以一起计算。

📜示例 3:byteshortchar 的自动转换

当涉及到 byteshort char 类型的运算时,这些类型会自动提升为 int,即使两者的值都很小。

byte b = 10;
short s = 20;
char c = 'A'; // 'A' 的 Unicode 值是 65int result1 = b + s; // byte 和 short 自动转换为 int
int result2 = b + c; // byte 和 char 自动转换为 intSystem.out.println(result1); // 输出 30
System.out.println(result2); // 输出 75 (10 + 65)

解释:在这两个例子中,byteshortchar 类型在运算过程中自动提升为 int 类型。

这是为了确保计算的准确性和避免可能的溢出问题。

隐式转换支持的基本类型:

  • byteshortintlongfloatdouble

  • charint

🔺这些转换都是安全的,不会导致数据丢失


强制转换(显式转换)

🔺强制转换 是一种显式的转换,当你需要将较大的数据类型转换为较小的数据类型时,必须手动完成。

就像将水壶里的水倒入杯子时需要小心控制。强制转换可能会导致精度丢失或数据截断

🔺转换格式:

目标数据类型 变量名 = (目标数据类型)被强转的数据;

📜示例 1:浮点数到整数的强制转换

double d = 9.99;
int i = (int) d; // 强制将 double 转换为 int
System.out.println(i); // 输出 9

解释: 在这个例子中,小数部分被丢弃了,因为 int 类型只能存储整数部分。这个过程是不可逆的,数据丢失是强制转换的常见问题。

📌拓展与注意:表达式强制转换,记得给表达式也加上括号,否侧计算机就会认为先强制转换d,再和a相加

double d = 9.99;
double a = 7.99;
int i = (int)(d + a); // 强制将表达式转换为 int
int j = (int) d + a;
System.out.println(i); // 输出 16
System.out.println(j); // 输出 16.99

📜示例 2:超出范围的强制转换

当一个数值超出目标类型的范围时,强制转换会导致意想不到的结果。比如从 long 转换为 int 时,如果数值超出了 int 的范围,结果就会出现溢出

long bigNum = 2147483648L; // 大于 int 最大值
int smallNum = (int) bigNum; 
System.out.println(smallNum); // 输出 -2147483648

解释: 因为 2147483648 超出了 int 的最大范围(2147483647),导致数值在转换时溢出,返回了一个负值。

强制转换常见的类型:

  • doublefloat

  • longint

  • intshort

  • floatbyte

这些强制转换可能会导致精度损失或者溢出,因此需要非常小心。


复杂类型中的转换

除了基本数据类型,Java 还支持对象之间的类型转换,但前提是它们必须属于同一个继承层次结构。在这种情况下,隐式转换通常出现在子类到父类的转换,而强制转换用于父类到子类

📜示例 1:子类向父类的隐式转换(多态)

class Animal {}
class Dog extends Animal {}
​
Animal animal = new Dog(); // 隐式转换,子类转换为父类

解释: 这里 Dog 类是 Animal 类的子类,Dog 对象可以隐式地转换为 Animal 类型。

📜示例 2:父类向子类的强制转换

Animal animal = new Dog(); // 父类引用指向子类对象
Dog dog = (Dog) animal; // 强制转换,父类转换为子类

解释: 虽然 animal 实际上引用的是 Dog 对象,但我们需要使用强制转换才能访问 Dog 类中特有的方法和属性。


🔴类型转换中的注意事项

  1. 类型安全性: 隐式转换通常是安全的,不会丢失数据,而强制转换则需要开发者确认目标类型足够大或不会导致意外数据丢失。

  2. 数据丢失风险: 强制转换时,可能会丢失小数部分或者数据超出范围,开发者需要特别小心。

  3. 类型不兼容: 并非所有类型都可以相互转换,比如 boolean 不能转换为 int


🌷结论🌷

Java 的数据类型转换机制为我们提供了在不同数据类型之间进行灵活转换的能力。

隐式转换是安全且自动的,而强制转换则需要更多的关注和理解。

了解这些转换规则不仅有助于编写更可靠的代码,还能帮助你避免潜在的数据丢失和溢出问题。

通过以上例子,你现在应该能够掌握 Java 中的数据类型转换,并在实际编程中合理应用。

🌷🌷🌷🌷🌷

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 分布式缓存服务Redis版解析与配置方式
  • 【Java版】云HIS系统源码
  • 字节推音乐生成神器 Seed-Music 支持多样化输入和精确控制
  • 微信小程序07-开发进阶
  • 计算机网络第二章:作业 2: UDP ping 程序
  • JavaScript基础学习:预解析机制
  • 2024 RedisAnd Mysql基础与进阶操作系列(13)作者——LJS[你个小黑子这都还学不会嘛?你是真爱粉嘛?真是的 ~;以后请别侮辱我家鸽鸽]
  • 螺栓与散装物体检测系统源码分享
  • idea生成类信息及快捷开发配置
  • PHP邮件发送教程:如何用PHP发送电子邮件?
  • SQLServer TOP(Transact-SQL)
  • 隨著 iOS 18 到來,AirPods Pro 2 解鎖移動頭部回應 Siri 功能
  • 【PyQt5】object属性
  • 2023年全国研究生数学建模竞赛华为杯B题DFT类矩阵的整数分解逼近求解全过程文档及程序
  • idea多模块启动
  • android 一些 utils
  • HTTP那些事
  • If…else
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • XML已死 ?
  • 从零开始学习部署
  • 关于for循环的简单归纳
  • 缓存与缓冲
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 前端攻城师
  • 小程序开发中的那些坑
  • 用Visual Studio开发以太坊智能合约
  • 原生Ajax
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • # SpringBoot 如何让指定的Bean先加载
  • #APPINVENTOR学习记录
  • #stm32驱动外设模块总结w5500模块
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (pycharm)安装python库函数Matplotlib步骤
  • (Ruby)Ubuntu12.04安装Rails环境
  • (solr系列:一)使用tomcat部署solr服务
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (四)opengl函数加载和错误处理
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (学习日记)2024.01.19
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (转)setTimeout 和 setInterval 的区别
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • .“空心村”成因分析及解决对策122344
  • .NET MVC 验证码
  • .Net MVC4 上传大文件,并保存表单
  • .NET 快速重构概要1
  • .secret勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复
  • @WebService和@WebMethod注解的用法
  • [ Linux 长征路第二篇] 基本指令head,tail,date,cal,find,grep,zip,tar,bc,unname