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

news/2024/10/31 7:29:50/

一、自动类型提升

自动类型提升是指在程序运行时因为某种情况需要,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.ppmy.cn/news/29809.html

相关文章

这款 Python 工具进行数据分析及数据可视化真的很棒啊

前言 大家好,今天我们以全国各地区衣食住行消费数据为例,来分析2022年中国统计年鉴数据,统计全国各地人民的消费地图,看看: 哪个省份的人最能花钱 哪个省份的人最舍得花钱 哪个省份的人最抠门 全国各地区人民在吃、穿…

成本降低90%,OpenAI正式开放ChαtGΡΤ

今天凌晨,OpenAI官方发布ChαtGΡΤ和Whisper的接囗,开发人员现在可以通过API使用最新的文本生成和语音转文本功能。OpenAI称:通过一系列系统级优化,自去年12月以来,ChαtGΡΤ的成本降低了90%;现在OpenAI用…

【大数据离线开发】8.3 Hive的数据模型

8.4 Hive的数据模型 Hive的数据存储 基于HDFS没有专门的数据存储格式存储结构主要包括:数据库、文件、表、视图可以直接加载文本文件(.txt文件)创建表时,指定Hive数据的列分隔符与行分隔符 8.4.1 内部表 hive 的内部表类似 My…

【超级猜图案例上半部分的实现 Objective-C语言】

一、超级猜图这么一个案例: 1.实现之后的效果是这样的: 1)中间有一个图片,点一下,能放大,背景变半透明的黑色: 2)再点一下图片,或者点周围黑色的阴影,图片回归原状, 3)右边有一个“大图”按钮,点一下,实现跟点图片一样的效果, 4)左边有一个“提示”按钮,点…

六、栈、栈的相关问题

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、栈 1.栈概述 2.栈的实现 2.1 栈的API 2.2 栈的实现 二、栈的括号匹配问题 1.问题描述 2.代码实现 三、逆波兰表达式求值问题 1.问题描述 2.代码 总结 前言 提…

超长文解析Linux块设备驱动编写方法

1.前提知识 一个块驱动提供对块存储设备(比如 SD 卡、EMMC、NAND Flash、Nor Flash、SPI Flash、机械硬盘、固态硬盘等)以固定大小(块的大小由内核决定,常常是 4096 字节 )的块为基本单位,进行随机的存取。…

路由器与交换机的区别(基础知识)

文章目录交换机路由器路由器和交换机的区别(1)工作层次不同(2)数据转发所依据的对象不同(3)传统的交换机只能分割冲突域,不能分割广播域;而路由器可以分割广播域(4&#…

Handler与线程

简介 Handler提供的种异步消息处理机制是:当它发出一个消息进入消息队列后,发送消息的函数立刻返回,接着主线程会逐个地从消息队列中把消息取出,然后对消息进行处理。明显,Handler发送消息和接收消息是异步进行的&…