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.mzph.cn/pingmian/20347.shtml

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

相关文章

Linux---用户及权限配置

文章目录 目录 文章目录 前言 一.基本概念 二.用户管理 创建用户 修改用户属性 用户组管理 用户授权 前言 用户在操作系统中是非常重要的,我们登录系统,访问共享文件夹等都需要用户进行验证。所以,掌握管理用户的知识非常有必要的 一.基…

笔墨挥毫如游龙 最是经典铁线篆——记著名书法家王子彬

真正的书法大家,必是经历了日积月累的求索磨炼,毕竟书法从来都不是一蹴而就的艺术,因此但凡是急功近利者,其人也是远远无法达到书入臻境的创作高度。而纵观当代书坛界内,其中王子彬先生的艺术声誉可谓是广为人知,作为一名深具传统功底的实力派书法大家,王子彬先生的取法历途无疑…

深度学习入门到放弃系列 - Jupyter Notebook添加虚拟环境

当使用conda创建完虚拟环境以后,terminal进入虚拟环境很简单,如何将虚拟环境添加到Notebook呢,这次把相关的命令记录一下。 Notebook未添加虚拟环境 添加完虚拟环境后 步骤如下: 安装ipykernel的命令如下: # 查看虚拟…

BioVendor—Surfactant Protein D Human ELISA

人表面活性剂蛋白D是糖蛋白和钙依赖凝集素胶原亚家族的一员。SP-D是一种同源三聚体蛋白,由三个43kDa单元组成,这些单元在它们的中间结合。大多数SP-D主要含有十二聚体(四个三聚体亚单位),但也观察到更高的多聚体。每个单元由至少四个离散的结…

解决:写路由文件时引入页面路径没有提示

1、首先安装插件: Path Autocomplete 2、配置settings.json 文件 复制下面代码到settings.json配置文件中: "path-autocomplete.pathMappings": {"": "${folder}/src/","views": "${folder}/src/views/&…

mysql大表的深度分页慢sql案例(跳页分页)-2

1 背景 有一张大表,内容是费用明细表,数据量约700万级, 普通B树索引KEY idx_fk_fymx_qybh_xfsj (qybh,xfsj)。 1.1 原始深度分页sql select t.* from fk_fymx t where t.qybh XXXXXXX limit 100000,100; 深度分页会导致加载数据行过多1000001…

案例实践 | 基于长安链的首钢供应链金融科技服务平台

案例名称-首钢供应链金融科技服务平台 ■ 建设单位 首惠产业金融服务集团有限公司 ■ 用户群体 核心企业、资金方(多为银行)等合作方 ■ 应用成效 三大业务场景,共计关联29个业务节点,覆盖京票项目全部关键业务 案例背景…

SDL教程(二)——Qt+SDL播放器

前言 ​ 这篇文章主要是使用SDL来打开视频,显示视频。后续会再继续使用SDL来结合FFmpeg。来能够直接使用网上的demo进行学习。 正文 一、环境 Qt 5.15.2 MSVC2019 64bit Win11 二、Qt搭建SDL Qt搭建,我觉得相比用VS2019来说,更为方便&…

【如何用爬虫玩转石墨文档?】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

短视频矩阵营销系统V2.3.0

抖音矩阵云混剪系统 源码短视频矩阵营销系统V2.3.0(免授权版)(感觉和上一个版本没什么区别)多平台多账号一站式管理,一键发布作品。智能标题,关键词优化,排名查询,混剪生成原创视频&…

k8s集群的存储卷、pvc和pv

目录 简介 简介 PV 全称叫做 Persistent Volume,持久化存储卷。它是用来描述或者说用来定义一个存储卷的,这个通常都是由运维工程师来定义。 PVC 的全称是 Persistent Volume Claim,是持久化存储的请求。它是用来描述希望使用什么样的或者说…

【WEEK14】 【DAY4】Swagger Part 2【English Version】

2024.5.30 Thursday Following up on 【WEEK14】 【DAY3】Swagger Part 1【English Version】 Contents 16.4. Configure Scanned Interfaces16.4.1. Modify SwaggerConfig.java16.4.1.1. Use the .basePackage() Method to Specify the Package Path for Scanning16.4.1.2. Ot…

【案例实战】 基于OpenCV实现鹿茸面积计算

学习《人工智能应用软件开发》,学会所有OpenCV技能就这么简单! 做真正的OpenCV开发者,从入门到入职,一步到位! 有人在我得B站答疑群里发了下面的图: 问:如何计算鹿茸最外圈蜡皮面积占整个鹿茸…

基于STC12C5A60S2系列1T 8051单片机的TM1638键盘数码管模块的数码管显示与TM1638芯片连接的按键的按键值应用

基于STC12C5A60S2系列1T 8051单片机的TM1638键盘数码管模块的数码管显示与TM1638芯片连接的按键的按键值应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍TM1638键盘…

word多级列表与上一级不匹配

问题:三级列表显示1.1.1,而实际情况应该是2.1.1,如何设置? 方法:鼠标在word原文停留在二级列表上,然后进入多级列表中设置三级列表

ChatGPT在工作中的使用案例

知识点提示 开发过程中,遇到某个知识点,忘记或者不清楚怎么使用了,通过ChatGPT快速生成使用提示和案例。代码库“字典” 比如C 11 判断数组所有元素为false 在 C11 中,可以使用标准库中的 all_of 算法来判断数组中的所有元素是…

根据TVbox修改而来的盒子双播软件-电视盒子内置源版-点播+直播双播盒子软件-供大家学习研究参考

是一款根据TVbox修改而来的盒子双播软件,经过无数次的更改适配了手机、平板、智能电视和TV盒子,并且支持安卓4.x,所以对很多旧的智能电视和盒子支持是相当友好的,也越来越好用,且对软件部分做出修改优化。内置超多优质资源,汇集了众多影视媒体资源,画质也非常的感人,并…

p2p文件传输小工具

使用webRTC的相关技术栈可以很轻松的开发一个p2p文件传输工具,这里主要讲下使用datachannel开发的一个文件传输工具client程序的使用 客户端A:需要可以访问公网,运行client的主机 客户端B:可以访问公网,可以和客户端…

云数融合与大数据技术在日常生活中的创新应用探索

前言 移动云模型服务产品在中国移动旗下主要包括云计算、大数据、人工智能等服务,它依托广泛的算力资源(4N31X)、丰富的网络接入资源和高品质云专网,实现算网端资源一站式开通,构建企业级一体化解决方案。 文章目录 前言云计算的日常应用智…

C++入门3——类与对象2(类的6个默认成员函数)

目录 1.类的6个默认成员函数 2. 构造函数 2.1 构造函数的概念 2.2 构造函数的特性 3. 析构函数 3.1 析构函数的概念 3.2 析构函数的特性 4.拷贝构造函数 4.1 拷贝构造函数的概念 4.2 拷贝构造函数的特性 5.赋值运算符重载函数 5.1运算符重载函数 5.2 赋值运算符重…