Java中的自动类型提升与强制类型转换

news2025/1/11 20:42:21

一、自动类型提升

自动类型提升是指在程序运行时因为某种情况需要,JVM将较小的数据类型自动转换为较大的数据类型,以保证精度和正确性。在Java中,需要进行类型提升的情况有以下几种:

1. byte、short和char提升为int类型

当运算表达式为byte、short或char类型之间的运算时,Java会将它们自动提升为int类型(不会改变原值),然后再执行运算。

byte a = 3; //二进制补码:0000 0011
byte b = -2;//二进制补码:1111 1110
int c = a & b;//得到的结果默认为int类型

char c1 = '0';//unicode编码\u0030 二进制00000000 00110000 十进制48
char c2 = '1';//unicode编码\u0031 二进制00000000 00110001 十进制49
int i = c1 + c2;//运算时char自动提升为int类型 运算结果的十进制为97
char c3 = (char) i;//97对应16进制为0x0061 对应Unicode字符为'a'
System.out.println(c3); //打印结果:a

为什么位数低于int的数值类型和字符类型在运算时jvm会对其进行类型提升?
1. 避免精度丢失或溢出的问题
2. 使用较小类型运算没有性能优势, JVM设计时计算机主流架构是32位,对于CPU来说,无论是8位的运算还是32位的运算,都是在一个时钟周期内完成的,使用较小类型并不能节省时间。

2. 较小数值类型提升为较大范围数值类型

当运算表达式中包含不同类型的数据,例如int类型和double类型,为了避免数据类型的不匹配,Java会将其中较小范围数据类型自动提升为另一个较大范围的数据类型,然后再执行运算。

int i = 3;
double j = 4.0;
//运行时先将i转换为double类型3.0
double l = i + j;//得到的结果默认为double类型

3. 实参提升为方法形参类型

当调用方法时,如果传递的参数类型与方法定义的参数类型不匹配,JVM会自动进行类型提升或类型转换(注意只能自动进行基础数据类型提升或子类向父类提升),以使参数类型与方法定义的参数类型相匹配。这种情况常见于一个通用的功能方法,形参为父类,但调用时可以传进其各个子类的对象作为实参,执行时会将对象提升为父类类型,但注意这只是改变引用的类型,其实际指向的对象仍然没有变,因此在方法中调用对象的属性或方法时仍然执行的是子类中重写的,以此实现对应细分的功能。这就体现了Java的多态性。
在这里插入图片描述

类型提升是在JVM运行时字节码指令执行阶段进行的,当执行字节码指令时,JVM会根据指令的类型和操作数的类型来进行类型提升。类型提升的目的是保证运算的正确性和精度,避免数据类型不匹配、精度丢失和溢出等问题。同时,类型提升也可以提高代码的可读性和可维护性,使程序更加健壮和可靠。需要注意的是,类型提升可能会增加运算的开销,因此在设计程序时应该尽可能避免无必要的类型提升。

二、强制类型转换

强制类型转换是指程序员在代码中使用类型标识强制将一个对象的类型转换为其他类型,它与自动类型提升的区别如下:

  1. 触发条件:类型提升是在Java虚拟机中自动进行的,通常发生在两个不同数据类型的运算中;而强制类型转换需要程序员在代码中显式地指定,通常发生在数据类型不匹配的情况下。

  2. 数据类型的变化:类型提升通常是将一个较小的数据类型自动转换为一个较大的数据类型,以保证数据的正确性和精度;而强制类型转换则可以将一个数据类型强制转换为另一个数据类型,但这可能会导致数据的精度丢失或溢出。

  3. 是否安全:类型提升是自动进行的,通常是安全的,不会导致数据的精度丢失或溢出;而强制类型转换需要程序员自己负责,如果转换不当可能会导致数据的精度丢失或溢出,或者抛出无法转换的异常,从而引发程序错误。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/388444.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

spark sql(五)sparksql支持查询哪些数据源,查询hive与查询mysql的区别

1、数据源介绍 sparksql默认查询的数据源是hive数据库,除此之外,它还支持其它类型的数据源查询,具体的到源码中看一下: 可以看到sparksql支持查询的数据源有CSV、parquet、json、orc、txt、jdbc。这些数据源中前面五个我还能理解&…

【Python】RPA批量生成word文件/重命名及批量删除

批量生成word文件 场景:需要新建多个类似文件名 比如:今天的事例是新建12个文件名为: ​ 保安员考试试卷1及答案.docx ​ 保安员考试试卷2及答案.docx ​ … ​ 保安员考试试卷12及答案.docx 痛点: ​ 手动操作重复性高&a…

目标检测中回归损失函数(L1Loss,L2Loss,Smooth L1Loss,IOU,GIOU,DIOU,CIOU,EIOU,αIOU ,SIOU)

文章目录L-norm Loss 系列L1 LossL2 LossSmooth L1 LossIOU系列IOU (2016)GIOU (2019)DIOU (2020)CIOU (2020)EIOU (2022)αIOU (2021)SIOU (2022…

【SpringCloud】SpringCloud详解之Eureka实战

目录前言SpringCloud Eureka 注册中心一.服务提供者和服务消费者二.需求三.搭建Eureka-Server四.搭建Eureka-Client(在服务提供者配置:用户订单)前言 微服务中多个服务,想要调用,怎么找到对应的服务呢? 这里有组件的讲解 → SpringCloud组件…

深圳大学《计算机论题》作业:大数据与人工智能技术对人类生活的影响

说明 本作业为小组作业,要求基于一场报告完成(即观后感)。共分4个小题,讨论人工智能时代的伦理思考。由于版权原因,不提供报告的具体内容,只展示答题内容。 第一题 (1) 你如何看待…

winform控件PropertyGrid的应用(使运行中的程序能像vistual studio那样设置控件属性)

上周在看别人写的上位机demo代码时,发现创建的项目模板是"Windows 窗体控件库"(如下图) 生成的项目结构像自定义控件库,没有程序入口方法Main,但却很神奇能调试,最后发现原来Vistual Studio启动了一个外挂程序UserContr…

LSM(日志结构合并树)_笔记

WAL:Write Ahead Log 写前日志,顺序日志文件 1 LSM tree的定义 LSM tree: Log-Structured-Merge-Tree,日志结构合并树。 Log-Structured Merge-tree (LSM-tree) is a disk-based data structure designed to provide low-cost …

Linux操作系统学习(了解文件系统动静态库)

文章目录浅谈文件系统了解EXT系列文件系统目录与inode的关系软硬链接动静态库浅谈文件系统 当我们创建一个文件时由两部分组成:文件内容文件属性,即使是空文件也有文件属性 一个文件没有被打开是存储在磁盘中的,而磁盘是计算机中的一个机械…

你想赚的钱不一定属于你

昨天一个同行跟我说,最近有个五十多万的订单,客户是拿着别人家的设计来找的他,跟了也有大半个月了,自己明明报的价格比原设计的公司要低,客户一直说会尽快下的,他原本想着能够从这个订单里赚到几万块&#…

王道计算机组成原理课代表 - 考研计算机 第六章 总线 究极精华总结笔记

本篇博客是考研期间学习王道课程 传送门 的笔记,以及一整年里对 计算机组成 知识点的理解的总结。希望对新一届的计算机考研人提供帮助!!! 关于对 “总线” 章节知识点总结的十分全面,涵括了《计算机组成原理》课程里的…

软件测试用例(3)

按照测试对象划分: 一)界面测试: 1)软件只是一种工具,软件和人的信息交流是通过界面来进行的,界面是软件和用户交流的最直接的一层,界面的设计决定了用户对于我们设计软件的第一映像,界面如同人的面孔,具有最吸引用户的…

Java中String详解(从原理理解经典面试题)

本篇文章我先通过经典面试题,筛选需要观看本篇文章的朋友,然后咱们介绍String的基本特性,通过基本特性就可以找到面试题的答案。最后咱们再深入每个面试题,通过字节码、编译原理、基本特性深入剖析所有的面试题,让大家…

jsp试卷分析管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP试卷分析管理系统是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql5.0&…

三、JavaScript

目录 一、JavaScript和html代码的结合方式 二、javascript和java的区别 1、变量 2、运算 3、数组(重点) 4、函数 5、重载 6、隐形参数arguments 7、js中的自定义对象 三、js中的事件 四、DOM模型 五、正则表达式 一、JavaScript和html代码的结合方…

代码执行漏洞 | iwebsec

文章目录00-代码执行漏洞原理环境01-eval函数示例命令执行写入webshellbash反弹shell02-assert函数示例webshell03-call_user_func函数示例04-call_user_func_array函数示例总结05-create_function函数示例06-array_map函数示例总结08-preg_replace漏洞函数示例07-preg_replace…

Centos 部署Oracle 11g

Centos 部署Oracle 11g部署Oracle 11g准备工作服务器信息oracle安装包服务器准备oracle环境安装Oracle静默方式配置监听以静默方式建立新库及实例部署Oracle 11g 在SpringMVC模式下开发web项目,必然会使用到关系型数据库来存储数据,目前使用比较多的关系…

18、多维图形绘制

目录 一、三维图形绘制 (一)曲线图绘制plot3() (二)网格图绘制 mesh() (三)曲面图绘制 surf() (四)光照模型 surfl() (五)等值线图(等高线图)绘制 cont…

电力系统系统潮流分析【IEEE 57 节点】(Matlab代码实现)

👨‍🎓个人主页:研学社的博客💥💥💞💞欢迎来到本博客❤️❤️💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密…

C语言函数:字符串函数及模拟实现strcmp()

C语言函数&#xff1a;字符串函数及模拟实现strcmp() strcmp()函数&#xff1a; 作用&#xff1a;进行字符串的比较大小。 引入&#xff1a;如下代码&#xff0c; #define _CRT_SECURE_NO_WARNINGS#include <stdio.h>int main() {char* p "wan";char* q &qu…

Spring MVC源码解析——HandlerMapping(处理器映射器)

Sping MVC 源码解析——HandlerMapping处理器映射器1. 什么是HandlerMapping2. HandlerMapping2.1 HandlerMapping初始化2.2 getHandler解析3. getHandlerInternal()子类实现3.1 AbstractUrlHandlerMapping与AbstractHandlerMethodMapping的区别3.2 AbstractUrlHandlerMapping3…