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,一经查实,立即删除!

相关文章

内网穿透(Intranet Penetration)

内网穿透(Intranet Penetration)是一种网络技术,用于在局域网(LAN)或内部网络中访问或连接另一个局域网或外部网络的设备或服务。内网穿透技术旨在克服局域网内部设备无法直接通过公共互联网访问的限制,使得…

Linux---用户及权限配置

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

mdkarm怎么编程:深度探索与实用指南

mdkarm怎么编程:深度探索与实用指南 在嵌入式系统开发的浩瀚星空中,mdkarm编程犹如一颗璀璨的明星,吸引着无数开发者的目光。然而,对于初学者而言,mdkarm编程的复杂性和深度往往令人望而生畏。本文将带你走进mdkarm编…

css3 中选择器间有空格与没空格的区别?

在 CSS3 中,选择器间的空格与没有空格表示不同的选择逻辑: 1、有空格的选择器:空格表示后代选择器。它选择的是某个元素的所有符合条件的后代元素。 div p {color: red; }这个选择器表示选择所有 div 元素内部的 p 元素,无论 p …

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

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

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

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

Sklearn文本特征提取

Sklearn文本特征提取 1、TF-IDF矢量化器2、英文文档计算TF-IDF3、中文文档计算TF-IDF 1、TF-IDF矢量化器 Sklearn提供了计算TF-IDF(详见:传送门)值的API:TfidfVectorizer(TF-IDF矢量化器) class sklearn.f…

BioVendor—Surfactant Protein D Human ELISA

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

格式刷不能跨工作薄使用,VBA自建公式快速获取 单元格背景色RGB值

查看视频效果请点击 文章目录 前言1.数字转字母代码:2.获取单元格背景颜色RGB值代码:前言 格式刷在我们调整Excel工作表、Word文档的格式时经常使用到,它可以帮助我们快速批量调整字体、大小、颜色、背景色等,甚至是表格行高列宽、字间距大小等。但如果在不同的Excel工作薄…

JSP前端怎么学:深入剖析学习路径与技巧

JSP前端怎么学:深入剖析学习路径与技巧 在数字化时代,前端技术作为用户界面的核心,其重要性不言而喻。JSP(Java Server Pages)作为一种基于Java的Web开发技术,在构建动态Web应用方面有着广泛的应用。那么&…

springmvc揭秘异常处理机制

HandlerExceptionResolver异常处理 HandlerExceptionResolver是专门进行异常处理的,在render之前进行工作,从异常中解析出ModelAndView public interface HandlerExceptionResolver { ModelAndView resolveException( HttpServletRequest re…

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

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

Matlab面向什么编程:深度剖析与应用探索

Matlab面向什么编程:深度剖析与应用探索 Matlab,作为一款广泛应用于工程和科学领域的编程语言和环境,其面向的编程对象和领域具有深厚的内涵和广泛的应用价值。本文将从四个方面、五个方面、六个方面和七个方面,对Matlab面向的编…

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,是持久化存储的请求。它是用来描述希望使用什么样的或者说…

【tansformers库】LLM基本过程 模型加载

参考doc: https://transformers.run/c2/2021-12-08-transformers-note-1/ transformer库 是个啥:封装一些NLP的东西,快速开箱即用,现在也多应用在大模型。 NLP/ LLM 基本过程 整体过程: 预处理,将文本转换为模型能…