Java——类型转换

一、类型转换

1、介绍

类型转换分为自动类型转换强制类型转换

2、自动类型转换

自动类型转换是指在表达式中,当两种不同的数据类型组合在一起时,较小的数据类型会自动转换为较大的数据类型,这个过程是自动的,无需编程者手动干预。在Java中,这种转换遵守以下规则,按照容量从小到大排列,自动类型转换会遵循以下顺序:

byte -> short -> int -> long -> float -> double

char -> int -> long -> float -> double

比如:

int i = 100;
long l = i;  // 自动类型转换从int到long
float f = l; // 自动类型转换从long到float

在上面的例子中,int 类型的 i 被自动转换为 long 类型的 l,然后 long 类型的 l 又被自动转换为 float 类型的 f

由容量大的类型到容量小的类型会导致精度损失而致使报错,由容量小的类型到容量大的类型一般会自动类型转换。

3、强制类型转换

强制类型转换的语法为:

type identify = (targetType)value;

就是在圆括号中加上你想要转换成的目标类型,放到变量或数值前面。

例如:

double num1 = 2.1;
int num2 = (int)num1;

这里的 num1 是 double 类型,强制转换为 int 类型会导致它的小数部分丢失。

二、补充

1、自动类型转换补充

①多种数据混合运算:

当有多种数据类型混合运算时,系统会先将数据都转换为这些数据类型中最大的数据类型,然后运算。

就像下面这个例子:

int num1 = 10;
float num2 = num1 + 10.0;

它会报以下错误:

这就是因为,num1 + 10.0 运算时,由于浮点数常量默认是 double 类型,所以这里系统会将数据都转换为这里的最大数据类型 double 类型,也就是将 num1 提升为 double 类型,所以这里的结果是 double 类型,所以不能赋值给 float 类型,会出现这个报错。

可以使用以下方法解决:

int num1 = 10;
float num2 = num1 + 10.0f;

int num1 = 10;
double num2 = num1 + 10.0;

②byte,short 和 char 类型不会相互自动转换:

byteshortchar 类型不会相互自动转换,可能与 char 类型是无符号数有关。

就像下面的代码,是错误的:

byte num1 = 10;
char num2 = num1;

③为什么可以直接将整型常量值赋给 byte,short 或 char:

我们知道整型常量的值默认是 int 类型,那为什么以下语句是正确的呢:

byte a = 10;
char b = 20;
short c = 30;

若整型常量的值是 int 类型的话,那么这里的10,20 和 30 不都是 int 类型吗,那它们怎么可以赋值给精度较小的 byte,short 或 char 类型呢?

这里是因为:Java允许直接将这些整型常量赋值给 byteshortchar 类型的变量,而不需要进行强制类型转换。这是Java语言设计中的一个特殊规则,旨在简化代码并减少不必要的类型转换。

具体来说,以下是Java中允许的直接赋值情况:

  • 如果整型常量的值在 byte 类型的范围内(即 -128 到 127),可以直接赋值给 byte 类型的变量。
  • 如果整型常量的值在 short 类型的范围内(即 -32,768 到 32,767),可以直接赋值给 short 类型的变量。
  • 如果整型常量的值在 char 类型的范围内(即 0 到 65,535),可以直接赋值给 char 类型的变量。

首先会检查这些整型常量是否是在这些范围内,如果在这些范围内,则可以正常赋值。如果超出这些范围,则会报错:

byte num = 300;

以上是对于常量来说的,如果是一个变量,那么就无法判断是否在这个范围内,即使变量的数值在这时就是在这个范围内的:

int num1 = 1;
byte num2 = num1;

这里就会直接报错,因为这里的 num1 是一个 int 型的变量,而不是常量:

④byte,short 和 char 类型在运算时会首先转化为 int 类型:

byteshortchar类型的变量参与运算时,它们会被提升至int类型。这意味着即使两个byte类型的变量相加,它们首先会被转换为int,然后再进行加法运算。如果想将结果赋值回一个byte类型的变量,就需要显式地进行类型转换,也就是进行强制类型转换。

我们可以通过下面的代码来证明:

public class Test {public static void main(String[] args) {byte num1 = 10;char num2 = 20;short num3 = num1 + num2;}
}

这里后面的num1 + num2再运算时会先提升到int然后运算,这时得到的结果是int型,然而int型的变量不能直接赋值给short型,所以这里会报错:

⑤boolean 不会参与任何转换

boolean 类型不会参与任何类型转换,这是因为 boolean 表示的是逻辑而不是数值,所以不能转换为其他类型。

在一些编程语言中(如 C 和 C++),数值 0 可以被视为假(false),非 0 值视为真(true)。这种设计可以导致歧义和混淆,特别是在逻辑与数值运算混合使用的时候。为了避免这种情况,Java 设计者决定不允许 boolean 类型与数值类型之间的隐式或显式转换。

2、强制类型转换补充

①将 int 类型数据赋值给 char 类型变量:

由于 int 类型常量只要在 char 类型范围内就可以正常赋值给 char 类型变量,所以我们可以直接将整型常量赋值给 char 类型变量。但是我们不能直接将 int 类型的变量直接赋值给 char 类型变量,这时就需要强制类型转换,但你需要知道这个 int 类型的变量的范围不应当超出 char 类型的范围:

public class Test {public static void main(String[] args) {int num1 = 65;char num2 = (char)num1;System.out.println(num2);}
}

这里是正确的,运行结果:

三、基本数据类型和 String 类型相互转换

1、基本数据类型向 String 类型转换

1)使用 + "" 方法

当一个字符串与任何其他类型的数据进行连接时,其他类型的数据会自动转换为String。然后连接成一个新的字符串。

        int num1 = 10;float num2 = 1.0f;double num3 = 3.0;long num4 = 1000L;short num5 = 20;boolean b = true;String str1 = num1 + "";String str2 = num2 + "";String str3 = num3 + "";String str4 = num4 + "";String str5 = num5 + "";String str6 = b + "";

2)使用 String.valueOf() 方法:

这是一个静态方法,可以接受各种类型的参数,并将其转换为 String 表示。

public class Test {public static void main(String[] args) {int num1 = 10;double num2 = 1.1;boolean b = true;String str1 = String.valueOf(num1);String str2 = String.valueOf(num2);String str3 = String.valueOf(b);System.out.println(str1 + " " + str2 + " " + str3);}
}

运行结果:

3)使用 toString() 方法:

 每个基本数据类型的包装类(如 Integer、Double、Boolean 等)都有一个 toString() 方法,可以将基本类型转换为 String。

        int i = 100;double d = 1.2;String str1 = Integer.toString(i);  // "100"String str2 = Double.toString(d);   // "1.2"

2、String 数据转换到基本数据类型

1)使用包装类的 parseXxx() 方法:

每个基本数据类型的包装类都提供了一个 parseXxx() 静态方法,可以将 String 转换为对应的基本类型(Xxx 是数据类型的首字母大写,如 parseIntparseDoubleparseBoolean 等)。

        String str1 = "100";int i = Integer.parseInt(str1);  // 100String str2 = "false";boolean b = Boolean.parseBoolean(str2); // false;

2)使用包装类的 valueOf() 方法:

除了 parseXxx() 方法,包装类还提供了 valueOf() 方法将 String 转换为基本类型。与 parseXxx() 方法不同,valueOf() 方法返回的是封装了基本数据类型的对象而不是基本数据类型本身,但在实际使用上,由于自动拆箱的存在,使用起来并无太大差异。

        String str1 = "100";String str2 = "true";String str3 = "1.11";int num1 = Integer.valueOf(str1);boolean b = Boolean.valueOf(str2);double num2 = Double.valueOf(str3);

3.注意事项

对于字符串类型转换成基本数据类型,需要确定字符串可以被正确解析成对应的基本数据类型。就像字符串 "nihao" 是无法被解析成整数的,如果强行将 "nihao" 转换为型,则会抛出异常,然后程序终止。

public class Test {public static void main(String[] args) {String str = "nihao";int i = Integer.parseInt(str);}
}

以上代码在运行时会抛出以下异常:

四、小细节

1、两个字符相加:

public class Test {public static void main(String[] args) {char ch1 = '好';char ch2 = '坏';System.out.println(ch1 + ch2);//这里会打印字符'好'的码值加上'坏'的码值}
}

运行以上代码,我们会得到以下结果:

由于 char 类型的变量在算数运算时会提升为 int 类型,这里就是这个原因,两个字符类型的数据提升到 int 类型,然后进行算数相加,最终得到两个字符的码值的和,所以会得到以上结果。

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

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

相关文章

清华大佬自曝:接到了省烟草局的offer,我就拒掉了华为!结果华为立马给我申请了特殊涨薪,总包70w是烟草的2倍,这可如何是好?

《网安面试指南》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484339&idx1&sn356300f169de74e7a778b04bfbbbd0ab&chksmc0e47aeff793f3f9a5f7abcfa57695e8944e52bca2de2c7a3eb1aecb3c1e6b9cb6abe509d51f&scene21#wechat_redirect 《Java代码审…

C:字符串函数(续)-学习笔记

穗 一些闲话: 最近玩了这款饿殍-明末千里行,不知大家是否有听过这款游戏,颇有感触!!! 游戏中最让我难以忘怀的便是饿殍穗线的故事,生在如今时代的我之前无法理解杜甫在目睹人间悲剧时的心情&…

【网络原理】❤️Tcp 连接管理机制❤️ “三次握手” “四次挥手”的深度理解, 面试最热门的话题,没有之一, 保姆式教学 !!!

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. 🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人…

华为 HCIP 认证费用和报名资格

在当今竞争激烈的信息技术领域,华为 HCIP认证备受关注。它不仅能提升个人的技术实力与职业竞争力,也为企业选拔优秀人才提供了重要依据。以下将详细介绍华为 HCIP 认证的费用和报名资格。 一、HCIP 认证费用 华为HCIP认证的费用主要由考试费和培训费构成…

电气自动化入门01:电工基础

视频链接:1.1 电工知识:电工基础_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1PJ41117PW?p2&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 1.电能和电力系统 2.电工常用物理量及其应用 2.1电阻: 2.2电流: 2.3电压&…

【C++】入门基础(下)

Hi!很高兴见到你~ 目录 7、引用 7.3 引用的使用(实例) 7.4 const引用 【第一分点】 【第二分点1】 【第二分点2】 7.5 指针和引用的关系(面试点) 8、inline 9、nullptr Relaxing Time! ———…

系统 IO

"裸奔"层次:不带操作系统的编程 APP(应用程序) -------------------------------- Hardware(硬件) 特点:简单,应用程序直接操作硬件(寄存器) 缺点: 1. 搞应用开发的必须要了解硬件的实现细节,能够看懂原理图…

MyBatis 增删改查【后端 17】

MyBatis 增删改查 引言 MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs (…

yolo训练出现Could not load library libcudnn_cnn_train.so.8问题及解决方法

问题场景: 训练yolov5或者yolov8时候会报错: Could not load library libcudnn_cnn_train.so.8. Error: /usr/local/cuda-12.1/lib64/libcudnn_cnn_train.so.8: uined symbol: _ZN5cudnn3cnn34layerNormFwd_execute_internal_implERKNS_7backend11Vari…

java技术栈介绍

Java技术栈是一个庞大而丰富的生态系统,它包含了从基础语言特性到高级框架、库和工具的整个集合。这个技术栈为开发者提供了构建各种类型应用(包括企业级应用、Web应用、移动应用、大数据应用等)所需的全部组件。以下是对Java技术栈的一个更详…

zip压缩包的格式不标准导致C++开源unzip.cpp解压失败问题的排查

目录 1、问题描述 2、初步排查 3、查看错误码512对应的含义 4、直接将解压zip包的函数拷贝过来,并将无法解压的zip取来,直接编写测试代码去调试解压过程,最终定位问题 4.1、调试开源unzip.cpp源码的准备工作 4.2、刚解压zip包中最顶层的文件夹就失败了 4.3、是不是zi…

深度学习之微积分预备知识点

极限(Limit) 定义:表示某一点处函数趋近于某一特定值的过程,一般记为 极限是一种变化状态的描述,核心思想是无限靠近而永远不能到达 公式: 表示 x 趋向 a 时 f(x) 的极限。 知识点口诀解释极限的存在左…

【CSS】 Grid布局:现代网页设计的基石

引言 最近接到一个网页布局比较复杂的页面,看了半天还是决定用grid布局来写,记录一下 布局是构建用户界面的关键部分。CSS Grid布局提供了一种简单而强大的方式来创建复杂的网格布局,它让设计师和开发者能够更直观、更灵活地控制网页的结构。…

MySQL 子查询全解析:执行、性能影响与优化策略

在 MySQL 数据库的操作中,子查询是一个强大而又复杂的工具。今天,我们就来深入探讨 MySQL 如何执行子查询、其性能影响、优化方法以及哪些情况下应避免使用子查询。 一、MySQL 如何执行子查询 非相关子查询 非相关子查询也被称为独立子查询,…

网络安全学习(三)Hydra破解密码

接下来看一下Hydra工具,这是一个暴力破解密码的工具。 使用命令(注意区分大小写)。 hydra -L user.txt账号字典 -P pass.txt密码字典 IP地址 smb协议名称 hydra -l administrator指定账号 -P pass.txt密码字典 IP地址 smb协议名称 hydra -…

数据结构(Day13)

一、学习内容 内存空间划分 1、一个进程启动后,计算机会给该进程分配4G的虚拟内存 2、其中0G-3G是用户空间【程序员写代码操作部分】【应用层】 3、3G-4G是内核空间【与底层驱动有关】 4、所有进程共享3G-4G的内核空间,每个进程独立拥有0G-3G的用户空间 …

【Go】Go语言介绍与开发环境搭建

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

OpenHarmony鸿蒙( Beta5.0)智能加湿器开发详解

鸿蒙开发往期必看: 一分钟了解”纯血版!鸿蒙HarmonyOS Next应用开发! “非常详细的” 鸿蒙HarmonyOS Next应用开发学习路线!(从零基础入门到精通) “一杯冰美式的时间” 了解鸿蒙HarmonyOS Next应用开发路…

算法提高模板强连通分量tarjan算法

AC代码&#xff1a; #include<bits/stdc.h>using namespace std;typedef long long ll; const int MOD 998244353; const int N 2e5 10;//强联通分量模板 //tarjan算法 vector<int>e[N]; int n, m, cnt; int dfn[N], low[N], ins[N], idx; int bel[N];//记录每…

【C++】—— 内存管理

【C】—— 内存管理 1 C/C 的内存划分 1.1 C/C 的内存分布1.2 C/C 的内存分布练习 2 C语言 中动态内存管理方式&#xff1a;malloc/calloc/realloc/free3 C 内存管理方式3.1 new / delete 操作内置类型3.2 new 和 delete 操作自定义类型3.2.1 new 和 delete 操作自定义类型基础…