java类型转换(强制类型转换)底层转换原理,此篇带你理解清楚

介绍

Java 中的类型强制转换(Type Casting)可以分为基本类型(primitive types)的强制转换和引用类型(reference types)的强制转换。它们在底层的原理和实现有所不同。以下是对这两种类型强制转换的详细解释

基本类型的强制转换

基本类型的强制转换涉及数值类型(如 int, float, double)之间的转换。基本类型的转换分为两类:自动类型转换(Widening Casting)和强制类型转换(Narrowing Casting)
自动类型转换(Widening Casting)
自动类型转换是将一个较小范围的基本类型转换为较大范围的基本类型。这种转换是自动进行的,不需要显式的强制转换操作符

int i = 100;
long l = i; // 自动类型转换
double d = l; // 自动类型转换

底层原理:
在自动类型转换中,Java 编译器会在编译时检查转换是否合法,并在运行时进行必要的数值扩展。例如,将 int 转换为 long 时,Java 会将 int 值扩展为 long 值
强制类型转换(Narrowing Casting)
强制类型转换是将一个较大范围的基本类型转换为较小范围的基本类型。这种转换需要显式地使用强制转换操作符

double d = 100.04;
long l = (long) d; // 强制类型转换
int i = (int) l; // 强制类型转换

底层原理:
在强制类型转换中,Java 编译器同样会在编译时检查转换是否合法。在运行时,Java 会进行数值截断或舍入。例如,将 double 转换为 int 时,小数部分会被截断

引用类型的强制转换

引用类型的强制转换涉及类和接口之间的转换。主要分为向上转型(Upcasting)和向下转型(Downcasting)
向上转型(Upcasting)
向上转型是将一个子类引用赋给父类引用。这种转换是自动进行的,不需要显式的强制转换操作符

class Animal {}
class Dog extends Animal {}Animal animal = new Dog(); // 向上转型

底层原理:
向上转型是在编译时进行类型检查,确保子类可以赋值给父类引用。在运行时,子类对象仍然是其实际类型(即 Dog),但只能通过父类引用访问父类中的成员。
向下转型(Downcasting)
向下转型是将一个父类引用赋给子类引用。这种转换需要显式地使用强制转换操作符

Animal animal = new Dog();
Dog dog = (Dog) animal; // 向下转型

底层原理:
向下转型需要在运行时进行类型检查(即 instanceof 检查)以确保转换的安全性。如果类型不匹配,会抛出 ClassCastException。在向下转型时,Java 虚拟机(JVM)会检查实际对象的类型是否与强制转换的目标类型兼容

实现细节

基本类型转换
Widening Casting:例如,将 int 转换为 long,JVM 会将 32 位整数值扩展为 64 位长整数值。
Narrowing Casting:例如,将 double 转换为 int,JVM 会丢弃小数部分,并将 64 位浮点数转换为 32 位整数
引用类型转换
Upcasting:在编译时,JVM 只需要检查子类是否可以赋值给父类引用。
Downcasting:在运行时,JVM 会通过内存中的对象头部信息和实际类型检查(通过 instanceof 或 checkcast 字节码指令)来确保安全性。如果对象的实际类型与目标类型不匹配,JVM 会抛出 ClassCastException

示例代码解析

以下是一个包含基本类型和引用类型强制转换的示例

public class TypeCastingExample {public static void main(String[] args) {// 基本类型强制转换double d = 100.04;long l = (long) d; // 强制类型转换int i = (int) l; // 强制类型转换System.out.println("Double value: " + d);System.out.println("Long value: " + l);System.out.println("Int value: " + i);// 引用类型强制转换Animal animal = new Dog(); // 向上转型Dog dog = (Dog) animal; // 向下转型System.out.println("Animal is Dog: " + (animal instanceof Dog));System.out.println("Dog instance: " + dog);}
}class Animal {// Animal class implementation
}class Dog extends Animal {// Dog class implementation
}

总结

Java 中的类型强制转换涉及基本类型和引用类型。基本类型的强制转换通过数值扩展和截断进行,而引用类型的强制转换通过类型检查和内存操作进行。理解这些原理对于编写安全高效的 Java 代码至关重要

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

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

相关文章

ElasticSearch聚合排序

聚合排序 根据之前的博客可知,ES对于聚合结果的默认排序规则有时并非是我们希望的。可以使用ES提供的sort子句进行自定义排序,有多种排序方式可供选择: 按照聚合后的文档计数的大小进行排序按照聚合后的某个指标进行排序按照每个组的名称进行排序1.1 按文档计数排序 在聚合排…

day12--150. 逆波兰表达式求值+239. 滑动窗口最大值+ 347. 前 K 个高频元素

一、150. 逆波兰表达式求值 题目链接:https://leetcode.cn/problems/evaluate-reverse-polish-notation/description/ 文章讲解:https://programmercarl.com/0150.%E9%80%86%E6%B3%A2%E5%85%B0%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%B1%82%E5%80%BC.html 视频…

R可视化:微生物相对丰度或富集热图可视化

欢迎大家关注全网生信学习者系列: WX公zhong号:生信学习者Xiao hong书:生信学习者知hu:生信学习者CDSN:生信学习者2介绍 热图(Heatmap)是一种数据可视化方法,它通过颜色的深浅或色调的变化来展示数据的分布和密度。在微生物学领域,热图常用于表示微生物在不同分组(如…

【leetcode刷题】面试经典150题 , 27. 移除元素

leetcode刷题 面试经典150 27. 移除元素 难度:简单 文章目录 一、题目内容二、自己实现代码2.1 方法一:直接硬找2.1.1 实现思路2.1.2 实现代码2.1.3 结果分析 2.2 方法二:排序整体删除再补充2.1.1 实现思路2.1.2 实现代码2.1.3 结果分析 三、…

除了等保2.0,还有哪些法规涉及云计算数据安全?

除了中国的等保2.0之外,全球范围内有多个法律法规涉及云计算数据安全,这些法规根据不同国家和地区的特点,对数据保护、隐私、跨境数据流动等方面提出了不同的要求。以下是一些主要的国际法规: 1. 欧盟通用数据保护条例 (GDPR)&am…

字符串专题详解

目录 字符串hash进阶 KMP算法 next数组 KMP算法 KMP算法优化 字符串hash进阶 字符串hash是指将一个字符串S映射为一个整数,使得该整数可以尽可能唯一地代表字符串S。那么在一定程度上,如果两个字符串转换成的整数相等,就可以认为这两个…

麻了,5年Java竟然不知道幂等......

在分布式系统中,接口幂等性是确保操作一致性的关键特性。 啥是幂等性 幂等性 指的是在给定的条件下,无论操作执行多少次,其结果都保持不变。在接口设计中,幂等性意味着使用相同的参数多次调用接口,应产生与单次调用相…

STM32学习笔记(五)--TIM输出比较PWM详解

(1)配置步骤1.配置RCC外设时钟 开启GPIO以及TIM外设2.配置时基单元的时钟 包含时钟源选择配置初始化时基单元3.配置输出比较单元 包含CCR的值 输出比较模式 极性选择 输出使能等4.配置GPIO口 初始化为复用式推挽输出的配置5.运行控制 启动计数器 输出PWM…

Windows CSC服务特权提升漏洞(CVE-2024-26229)

文章目录 前言声明一、漏洞描述二、漏洞成因三、影响版本四、漏洞复现五、CVE-2024-26229 BOF六、修复方案 前言 Windows CSC服务特权提升漏洞。 当程序向缓冲区写入的数据超出其处理能力时,就会发生基于堆的缓冲区溢出,从而导致多余的数据溢出到相邻的…

QT 的文件

QT 和C、linux 一样,也有自带的文件系统. 它的操作和C、c差不多,不过也需要我们来了解一下。 输入输出设备类 QObject 有一个子类,名为 QIODevice 类,如其名字,该类是管理所有输入输出设备的类。 比如文件、网络套…

北大oj Coins

Problem: 北大oj Coins 文章目录 思路解题方法复杂度Code 思路 题目要求我们找出所有可能组成的金额总数,给定一系列硬币面值和每种硬币的数量。我们使用动态规划来解决这个问题。关键在于如何处理每种硬币数量大于1的情况,这需要对余数进行分组&#xf…

主键索引与唯一索引的区别

主键索引与唯一索引的区别: 1、主键索引是一种约束,唯一索引是一种索引,两者在本质上是不同的。 2、主键索引创建后一定包含一个唯一索引,唯一索引不一定包含主键索引。 3、主键索引不允许为空,唯一索引可以为空。 …

【ic-tool】timegen使用

一、前言 TimeGen是一个用于时序波形编辑的CAD工具,它允许数字设计工程师快速有效地绘制数字时序图。TimeGen时序图可以很容易地导出到其他窗口程序,如microsoftword,用于编写设计规范。可直接从官网下载TimeGEN软件:TimeGen Pro…

vue音乐播放条

先看效果 再看代码 <template><div class"footer-player z-30 flex items-center p-2"><div v-if"isShow" class"h-12 w-60 overflow-hidden"><div :style"activeStyle" class"open-detail-control-wrap&…

有什么可以创建ai聊天的软件?5个软件帮助你快速创建ai聊天

有什么可以创建ai聊天的软件&#xff1f;5个软件帮助你快速创建ai聊天 AI聊天软件是一种利用人工智能技术构建的聊天机器人系统&#xff0c;它能够模拟人类的对话方式&#xff0c;回答用户提出的问题或者进行对话。这类软件在各个领域都有广泛的应用&#xff0c;可以用于客户服…

【产品经理】订单处理5-可售库存管理

可售库存即销售库存&#xff0c;本文讲解订单处理过程中的可售库存的管理。 本次讲解订单处理过程中的可售库存的管理。 可售库存即销售库存&#xff0c;电商ERP中的可售库存共分三种&#xff1a;商品的可售现货库存、商品的预售库存以及赠品的可售库存。 一、商品的可售现货…

Gobject tutorial 五

参考&#xff1a;GObject – 2.0: Type System Concepts Type System Concepts The GLib Dynamic Type System 在GLib中&#xff0c;类型的概念比通常所理解的Ojbect type更宽泛。我们将对新类型注册到类型系统时使用的函数及数据结构进行了解&#xff0c;来对此进行说明。 …

大数据之flink与hive

其实吧我不太想写flink&#xff0c;因为线上经验确实不多&#xff0c;这也是我需要补的地方&#xff0c;没有条件创造条件&#xff0c;先来一篇吧 flink&#xff1a; 高性能 低延迟 流批一体的分布式计算框架 基于事件时间 对实时数据精准处理 快速响应 支持批处理&#xff0c…

腾讯云点播ugc upload | lack signature 问题处理

我犯一个很傻的错误 参考腾讯云官方文档&#xff1a;云点播 Web 端上传 SDK-开发指南-文档中心-腾讯云 进行开发&#xff0c;但是却报错了&#xff0c;始终找不到问题&#xff0c;错误提示&#xff1a;ugc upload | lack signature&#xff0c;意思是缺少签名或者签名失败&…

Python基础用法 之 转义字符

将两个字符进⾏转义 表示⼀个特殊的字符 \n ---> 换⾏&#xff0c;回⻋ \t ---> 制表符, tab键 注意&#xff1a; print( end\n)&#xff1a; print() 函数中默认有⼀个 end\n, 所以,每个 print 结束之后, 都会输出⼀ 个换行。 未完待续。