【一步一步了解Java系列】:探索Java基本类型转换的秘密

看到这句话的时候证明:此刻你我都在努力~

                                加油陌生人~

                                

个人主页:  Gu Gu Study    

                                              ​​

专栏:一步一步了解Java

喜欢的一句话: 常常会回顾努力的自己,所以要为自己的努力留下足迹。

如果喜欢能否点个赞支持一下,谢谢啦!

                                                                                                                作者:小闭


 
Java 中的类型转化

在 Java 中,类型转化是一种常见的操作,它允许我们将一种数据类型转换为另一种数据类型。类型转化可以分为自动类型转换和强制类型转换。

int a = 10;
long b = 100L;
b = a; // 可以通过编译
a = b; // 编译失败

看上上面的代码是否有了那么一些疑惑了呢?至于为什么,下面的知识会给你答案! 


一、自动类型转换

自动类型转换是指在不丢失信息的情况下,将一种数据类型自动转换为另一种数据类型。这种转换通常发生在取值范围较小的数据类型向取值范围较大的数据类型转换时。(代码不需要经过任何处理,在代码编译时,编译器会自动进行处理。


 
1.1 自动类型转换(隐式)
 

 例如:byte转化为int类型

byte b = 10;
int i = b;  // 自动类型转换

这里byte的取值范围是比int型的取值范围小所以是可以完成自动类型转换

public class Test {
    public static void main(String[] args) {


        System.out.println(18);// 整型默认情况下是int
        System.out.println(18.8); // 浮点型默认情况下是double

        int a = 100;
        long b = 10L;
        b = a; // a和b都是整形,a的范围小,b的范围大,当将a赋值给b时,编译器会自动将a提升为long类型,然后赋值
        a = b; // 编译报错,long的范围比int范围大,会有数据丢失,不安全
        float f = 3.14F;
        double d = 5.12;
        d = f; // 编译器会将f转换为double,然后进行赋值
        f = d; // double表示数据范围大,直接将float交给double会有数据丢失,不安全
        byte b1 = 100; // 编译通过,100没有超过byte的范围,编译器隐式将100转换为byte
        byte b2 = 257; // 编译失败,257超过了byte的数据范围,有数据丢失
    }
}

因为现在的编译器功能都比较强大所以,这里编译器已经将错误的地方都给标红了,我们是很容易看出来哪里是错误的。当然注释里也是很明确地写出来错误的原因了。

二、强制类型转换

2.1强制类型转换(显式)

强制类型转换是指通过显式的操作将一种数据类型强制转换为另一种数据类型。这种转换可能会导致信息丢失或数据错误,因此需要谨慎使用。

有小伙伴可能就会疑惑那如果我非要强制将取值范围大的转换为取值范围小的类型,有没有办法呢,有那就是强制类型转换,当然它也可以将取值范围小的类型强制转换为取值范围大的数据类型。
 
强制类型转换的语法为: (目标类型)值 。
 
需要注意的是,在进行强制类型转换时,如果转换后的结果超出了目标类型的取值范围,可能会导致数据异常。
 

public class Test {
    public static void main(String[] args) {

        int a = 10;
        long b = 100L;
        b = a; // int-->long,数据范围由小到大,隐式转换
        a = (int)b; // long-->int, 数据范围由大到小,需要强转,否则编译失败
        float f = 3.14F;
        double d = 5.12;
        d = f; // float-->double,数据范围由小到大,隐式转换
        f = (float)d; // double-->float, 数据范围由大到小,需要强转,否则编译失败
        a = d; // 报错,类型不兼容
        a = (int)d; // int没有double表示的数据范围大,需要强转,小数点之后全部丢弃
        byte b1 = 100; // 100默认为int,没有超过byte范围,隐式转换
        byte b2 = (byte)257; // 257默认为int,超过byte范围,需要显示转换,否则报错
        boolean flag = true;
        a = flag; // 编译失败:类型不兼容
        flag = a; // 编译失败:类型不兼容

    }

注意事项: 

1. 不同数字类型的变量之间赋值, 表示范围更小的类型能隐式转换成范围较大的类型

2. 如果需要把范围大的类型赋值给范围小的, 需要强制类型转换, 但是可能精度丢失

例如:

public class Test {
    public static void main(String[] args) {
        int a;
        float i;
        double b=3.14;
        a=(int)b;
        i=(float)b;
        System.out.println(a);
        System.out.println(b);




    }

但是如果将a+b;赋给一个short类型就会报错。因为会自动将a+b提升

3. 将一个字面值常量进行赋值的时候, Java 会自动针对数字范围进行检查

如图: 

这里我们的byte类型的最大值为127,当我们字面赋值为128时,这里就直接标红告诉我们错误了,这就是java相比于C的严谨性。 

4. 强制类型转换不一定能成功,不相干的类型不能互相转换

 如下:boolean类型是不能参与强制转换类型的


 



三、类型提升

3.1  在进行某些运算时,不同类型的数据会被提升到共同的类型。例如,在进行算术运算时, byte 和 short 类型会被提升到 int 类型。
 

 

如上面,short与byte类型直接就可以自动提升为int类型了,所以编译器是无法进行自动转换类型进行正常赋值的。


 四、 字符串类型

4.1 字符串转换为整形

再Java中字符串也是可以强制转换为整形的。

如下:

String str = "100";
int num = Integer.parseInt(str);

这时num的值就是100.


4.2整形转换为字符串

int num = 10;
// 方法1
String str1 = num + ""; 
// 方法2
String str2 = String.valueOf(num);


文章到末尾,喜欢的话,点个赞吧。
 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第四百九十二回

文章目录 1. 概念介绍2. 使用方法2.1 SegmentedButton2.2 ButtonSegment 3. 代码与效果3.1 示例代码3.2 运行效果 4. 内容总结 我们在上一章回中介绍了"SearchBar组件"相关的内容,本章回中将介绍SegmentedButton组件.闲话休提,让我们一起Talk …

Java面试题:多线程3

CAS Compare and Swap(比较再交换) 体现了一种乐观锁的思想,在无锁情况下保证线程操作共享数据的原子性. 线程A和线程B对主内存中的变量c同时进行修改 在线程A中存在预期值a,修改后的更新值a1 在线程B中存在预期值b,修改后的更新值b1 当且仅当预期值和主内存中的变量值相等…

Llama3-Tutorial之XTuner微调Llama3个人小助手

Llama3-Tutorial之XTuner微调Llama3个人小助手 使用XTuner微调llama3模型。 参考: https://github.com/SmartFlowAI/Llama3-Tutorial 1. web demo部署 参考上一节内容已经完成web demo部署,进行对话测试, 当前回答基于llama3官方发布的模型进行推理生成&…

MySQL基础_5.多表查询

文章目录 一、多表连接1.1、笛卡尔积(或交叉连接) 二、多表查询(SQL99语法)2.1、内连接(INNER JOIN)2.2、内连接(INNER JOIN) 一、多表连接 多表查询,也称为关联查询,指两个或更多个表一起完成查询操作。 …

利用matplotlib和networkx绘制有向图[显示边的权重]

使用Python中的matplotlib和networkx库来绘制一个有向图,并显示边的权重标签。 1. 定义了节点和边:节点是一个包含5个节点的列表,边是一个包含各个边以及它们的权重的列表。 2. 创建了一个有向图对象 G。 3. 向图中添加节点和边。 4. 设置了…

Sarcasm detection论文解析 |基于情感背景和个人表达习惯的有效讽刺检测方法

论文地址 论文地址:https://link.springer.com/article/10.1007/s12559-021-09832-x#/ 论文首页 笔记框架 基于情感背景和个人表达习惯的有效讽刺检测方法 📅出版年份:2022 📖出版期刊:Cognitive Computation 📈影响因子:5.4 &…

光检测器——光纤通信学习笔记七

光检测器 光检测器的基本介绍 作用:把接受到的光信号转换成电信号 光接收器的灵敏度、光源的发光功率和光纤的损耗三者决定了光纤通信的传输距离; 光电二极管 光电转换的基本原理 之前提到,PN结由于内部载流子的扩散运动形成了内部电场&…

[Java EE] 多线程(八):CAS问题与JUC包

🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏:🍕 Collection与数据结构 (90平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 🧀Java …

华为 二层交换机与防火墙连通上网实验

防火墙是一种网络安全设备,用于监控和控制网络流量。它可以帮助防止未经授权的访问,保护网络免受攻击和恶意软件感染。防火墙可以根据预定义的规则过滤流量,例如允许或阻止特定IP地址或端口的流量。它也可以检测和阻止恶意软件、病毒和其他威…

git与gitlab

目录 gitlab 下载与安装 重置管理员密码 gitlab命令 git远程gitlab相关命令 认证 补充 git git 分布式版本控制 安装 git的四个区域与文件的四个状态 使用git 常用命令 git 分布式管理系统 gitlab 企业私有库 github 公网共享库,全球…

hinge loss(损失函数)

Devise模型中用到hinge loss和相似性度量相结合计算损失,其损失如下: 举例说明该损失如何计算 运用公式2:(常用公式2)Devise模型用到的是公式2 参考:https://blog.csdn.net/weixin_43055882/article/det…

Java新手必看:快速上手FileOutPutStream类

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一…

OpenHarmony实战开发-应用侧调用前端页面函数

应用侧可以通过runJavaScript()方法调用前端页面的JavaScript相关函数。 在下面的示例中&#xff0c;点击应用侧的“runJavaScript”按钮时&#xff0c;来触发前端页面的htmlTest()方法。 前端页面代码。 <!-- index.html --> <!DOCTYPE html> <html> <…

58行代码把Llama 3扩展到100万上下文,任何微调版都适用 | 最新快讯

量子位公众号 QbitAI 堂堂开源之王 Llama 3&#xff0c;原版上下文窗口居然只有……8k&#xff0c;让到嘴边的一句“真香”又咽回去了。 在 32k 起步&#xff0c;100k 寻常的今天&#xff0c;这是故意要给开源社区留做贡献的空间吗&#xff1f; 开源社区当然不会放过这个机会&a…

Llama3-Tutorial之LMDeploy高效部署Llama3实践

Llama3-Tutorial之LMDeploy高效部署Llama3实践 Llama 3 近期重磅发布&#xff0c;发布了 8B 和 70B 参数量的模型&#xff0c;lmdeploy团队对 Llama 3 部署进行了光速支持&#xff01;&#xff01;&#xff01; 书生浦语和机智流社区同学光速投稿了 LMDeploy 高效量化部署 Llam…

对于子数组问题的动态规划

前言 先讲讲我对于这个问题的理解吧 当谈到解决子数组问题时&#xff0c;动态规划(DP)是一个强大的工具&#xff0c;它在处理各种算法挑战时发挥着重要作用。动态规划是一种思想&#xff0c;它通过将问题分解成更小的子问题并以一种递归的方式解决它们&#xff0c;然后利用这些…

【华为】IPSec VPN手动配置

【华为】IPSec VPN手动配置 拓扑配置ISP - 2AR1NAT - Easy IPIPSec VPN AR3NATIPsec VPN PC检验 配置文档AR1AR2 拓扑 配置 配置步骤 1、配置IP地址&#xff0c;ISP 路由器用 Lo0 模拟互联网 2、漳州和福州两个出口路由器配置默认路由指向ISP路由器 3、进行 IPsec VPN配置&…

Redission分布式锁 watch dog 看门狗机制

为了避免Redis实现的分布式锁超时&#xff0c;Redisson中引入了watch dog的机制&#xff0c;他可以帮助我们在Redisson实例被关闭前&#xff0c;不断的延长锁的有效期。 自动续租&#xff1a;当一个Redisson客户端实例获取到一个分布式锁时&#xff0c;如果没有指定锁的超时时…

笔记86:关于【#ifndef + #define + #endif】的用法

当你在编写一个头文件&#xff08;例如 pid_controller.h&#xff09;时&#xff0c;你可能会在多个源文件中包含它&#xff0c;以便在这些源文件中使用该头文件定义的函数、类或其他声明。如果你在多个源文件中都包含了同一个头文件&#xff0c;那么当你将整个工程统一编译&am…

银行卡实名认证API接口快速对接

银行卡实名认证API接口又叫银行卡核验类API接口、银行卡验证类API接口、银联核验类API接口,根据入参字段不同&#xff0c;分银行卡二要素验证API接口&#xff0c;银行卡三要素验证API接口&#xff0c;银行卡四要素验证API接口。其中&#xff0c;银行卡二要素验证API接口是验证开…