【一步一步了解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);// 整型默认情况下是intSystem.out.println(18.8); // 浮点型默认情况下是doubleint 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转换为bytebyte 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);


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

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

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

相关文章

内网端口转发与代理

思路:渗透的前提是双方能够建立通信。目前无法和win7建立通信,但是拿到了windows2003的权限,所以可以在Windows2003主机上面建立节点,作为跳板机去访问到内网。 目前状态:控制win2003(IP:192.1…

活动回放 | 如何进行全增量一体的异构数据库实时同步

以 AI领域为代表的新技术不断涌现,新的应用风口也逐渐清晰。为了加紧跟上技术发展的步伐,越来越多的企业开始着手,对仍以传统关系型数据库为主的应用后端进行现代化升级。 这就涉及到如何在不影响并保持现有业务系统正常运转的前提下&#xf…

软件测试产品交付包括哪些内容?

软件测试产品交付通常会包括以下内容: 1. 测试计划:详细的测试方案、测试范围、测试资源与时间安排等内容。 2. 测试用例:包括功能测试用例、性能测试用例、安全测试用例等各类测试用例。 3. 测试环境:包括硬件环境、软件环境、网络环境、数据环境等测试所需要的各种环境。 4. …

LeetCode 面试题 17.14 —— 最小 k 个数

阅读目录 1. 题目2. 解题思路一3. 代码实现一4. 解题思路二5. 代码实现二 1. 题目 2. 解题思路一 第一种方法就是利用快速排序,第一次排序后,数组被划分为了左右两个区间 [ 0 , i ] , [ i 1 , a r r . s i z e ( ) − 1 ] [0, i], [i1, arr.size()-1]…

Docker入门指南:Docker容器的部署(一)

🍀 前言 博客地址: CSDN:https://blog.csdn.net/powerbiubiu 👋 简介 当今软件开发领域中,Docker 成为了一种流行的容器化技术。Docker 可以帮助开发者将应用程序及其依赖项打包到一个独立且可移植的容器中&#xf…

Hibernate 元数据模型(MetaModel)提示类没有找到错误

在进行一次编译的时候,提示下面的错误信息: java: java.lang.ClassNotFoundException: org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor 问题和解决 如果你对 Hibernate 的元数据还是不非常了解的话,请参考文章: JPA 的…

2002-2021年各地区平均受教育年限数据(分性别)(含原始数据+计算过程+计算结果)

2002-2021年各地区平均受教育年限数据(分性别)(含原始数据计算过程计算结果) 1、时间:2002-2021年 2、来源:国家统计局、统计年鉴、各省年鉴 3、指标:行政区划代码、地区、年份、人均受教育年…

C++11,{}初始化,initializer_list,decltype,右值引用,类和对象的补充

c98是C标准委员会成立第一年的C标准,C的第一次更新是C03,但由于C03基本上是对C98缺陷的修正,所以一般把C98与C03合并起来,叫做C98/03; 后来原本C委员会更新的速度预计是5年更新一次,但由于C标准委员会的进…

Linux环境下的事件驱动力量:探索Libevent的高性能I/O架构

hello !大家好呀! 欢迎大家来到我的Linux高性能服务器编程系列之《Linux环境下的事件驱动力量:探索Libevent的高性能I/O架构》,在这篇文章中,你将会学习到Libevent的高性能I/O原理以及应用,并且我会给出源码…

一竞技MSI:淘汰赛抽签结果出炉 BLG和T1同半区,TES首轮交手TL!

北京时间5月6日,MSI在今天进入短暂的休赛,在昨天结束的入围赛之后,PSG战队作为外卡赛区唯一的队伍进入到正赛,另外欧洲赛区的FNC战队也是击败GAM战队拿到正赛的资格。在比赛结束之后,也是进行了淘汰赛的胜败分组赛的抽…

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

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

OpenHarmony实战开发-上传文件

Web组件支持前端页面选择文件上传功能,应用开发者可以使用onShowFileSelector()接口来处理前端页面文件上传的请求。 下面的示例中,当用户在前端页面点击文件上传按钮,应用侧在onShowFileSelector()接口中收到文件上传请求,在此接…

详解xml-java语言

1.XML在线学习手册 XML 教程 2.XML可以做什么 1.给两个程序之间进行数据通信。现在用的最多的是JSON。 2.给服务器做配置文件。 3.存储复杂的数据关系。 4.还可以充当小型的数据库。 3.书写格式 <?xml version"1.0" encoding"UTF-8" ?> <…

使用Gitbook生成电子书

背景 《Google工程实践文档》相对原文Google’s Engineering Practices documentation &#xff0c;部分内容过时了。需要更新中文版&#xff0c;并使用Gitbook把Markdown文件转换成对应的PDF电子书。   上一次生成PDF电子书是5年前&#xff0c;当时生成电子书的环境早已不在…

虚拟键代码

虚拟键代码 虚拟键码 (Winuser.h) - Win32 apps | Microsoft Learn 在Windows操作系统中&#xff0c;虚拟键代码&#xff08;Virtual-Key Codes&#xff09;是一组用来表示键盘上按键的数值。这些代码通常用于Windows API函数&#xff0c;以便程序能够识别和处理键盘输入。 虚拟…

Linux第三节--常见的指令介绍集合(持续更新中)

点赞关注不迷路&#xff01;&#xff0c;本节涉及初识Linux第三节&#xff0c;主要为常见的几条指令介绍。 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&#x1f44d;&#x1f3fb; 收藏 ✨ 加关注&#x1f440; 期待与你共同进步! Linux下基本指令 1. man指令 Linu…

百科词条创建机构有哪些?

在互联网时代&#xff0c;百度百科作为我国最大的中文百科全书&#xff0c;已经成为人们获取知识、查询信息的重要途径。随着百度百科影响力的不断扩大&#xff0c;越来越多的人和企业试图通过创建企业词条来提升自身知名度&#xff0c;企业和个人为了在百度百科上占据一席之地…

GoLand安装教程

GoLand-安装 GoLand是Go语言编程开发的一款工具&#xff0c;和 IntelliJ IDEA 一样&#xff0c;同为Jetbrains公司旗下的产品&#xff0c;专为Go语言开发的跨平台商业集成开发环境&#xff08;IDE&#xff09;&#xff0c;它的功能非常强大&#xff0c;它还不仅仅是一个Go IDE…

记一次动态规划的采坑之旅, 741摘樱桃 https://leetcode.cn/problems/cherry-pickup/description/

首次看题目时&#xff0c;发现是困难。立马想到了&#xff0c;动态规划。 再看题目&#xff0c; 摘樱桃&#xff0c;还要返回摘两次&#xff0c;求摘最多的樱桃。 大脑第一反应就是&#xff1a; 先使用动态规划&#xff0c;找到 0 0 到 n-1 n-1处走过的最大樱桃&#xff0c; 并…

重写muduo之EPollPoller

1、EPollPoller.h EPollPoller的主要实现&#xff1a;作为poller的派生类&#xff0c;把基类给派生类保留的这些纯虚函数的接口实现出来。 override表示在派生类里面&#xff0c;这些方法是覆盖方法。必须由编译器来保证在基类里面一定有这些函数的接口的声明。在派生类要重写…