前言

在上一篇文章中,壹哥给大家讲解了Java中的数据类型,从此大家就知道了基本类型和引用类型,尤其是8种基本类型的使用和各自特点。但实际上数据类型的使用还有很多更深入的内容,比如java数据类型直接的转换,包括自动类型转换和强制类型转换。在今天的文章中,壹哥会继续给大家深入地讲解java数据类型的相关内容。

------------------------------前戏已做完,精彩即开始----------------------------

全文大约【4000】字,不说废话,只讲可以让你学到技术、明白原理的纯干货!本文带有丰富案例及配图,让你更好的理解和运用文中的技术概念,并可以给你带来具有足够启迪的思考......

一、数据类型转换

1. 背景

我们知道,Java中的数据类型总体可以分为两大类,分别是基本类型和引用类型,如下图所示:

这些不同类型的数据,开辟出的内存空间大小不同,所以每种类型的取值范围就不同。而且壹哥给大家举过例子,不同的数据类型之所以取值范围不同,就好比每种类型都是不同的房型,有大有小,如下图所示:

所以不同的类型占用的字节大小不同,取值范围也不一样。另外我们还知道,一个变量可以赋值给另一个变量,当然前提是他们的类型差不多。那么此时可能就存在一个问题:如果把byte变量赋值给int变量行不行?反之,把int变量赋值给byte行不行?java引用类型之间也能互相转换吗?如果可以的话,会不会出现什么问题?

2. 方式

Java要求=等号左边和=等号右边的类型要一致,如果不一致,就需要进行数据类型转换。Java中不同的类型之间,在满足数据兼容的条件下可以实现转换。Java的数据类型转换,大致有如下几种转换方案:

自动类型转换:容量小的类型自动转换为容量大的数据类型;

强制类型转换:容量大的数据类型转换为容量小的数据类型;

隐含强制类型转换(初始化):在变量初始化时,int类型会隐含强制转换成低级别的byte和short类型

其他类型转换:包装类、字符串、基本类型直接的转换。

对基本类型来说,常见的数据转换方式包括自动类型和强制类型转换;对引用类型而言,只存在强制类型转换一种形式。

3. 基本原则

我们在进行类型转换时,无论自动和强制类型转换,都要遵循如下基本原则:

不能对boolean类型进行类型转换;

不能把对象类型转换成不相关的类对象;

把容量大的类型转换为容量小的类型时,必须使用强制类型转换;

类型转换过程中,可能会导致溢出或损失精度;

浮点数到整数的转换,是通过舍弃小数得到的,而不是四舍五入。

接下来壹哥就通过一些案例,来给大家讲讲这几种类型转换都是怎么回事,以及如何实现转换。

二、自动类型转换(隐式转换)

1. 概念

所谓的自动类型转换,是指在基本类型中,容量小的数据类型可以自动转换为容量大的数据类型。在数据类型兼容的情况下,小转大就是自动类型转换,自动类型转换也被称为隐式类型转换不需要我们做任何额外的操作。

2. 转换规律(重点)

根据自动类型转换的定义,8种基本类型之间的自动转换关系如下图所示:

根据上图,壹哥给大家提取了基本类型进行自动类型转换时的基本规律,如下:

1. 自动类型转换必须满足,转换前数据类型的位数要低于转换后的数据类型;

2. 当多种数据类型的数据混合运算时,Java首先会自动将所有的数据转换成容量最大的那种数据类型,然后再进行计算;

3. byte、short、char这三者之间不会相互转换,他们三者在计算时首先都会转换为 int 类型;

4. boolean类型不能与其他任何基本数据类型进行转换;

5. 当把任意基本数据类型(包括boolean)的值和字符串进行连接运算时,基本数据类型的值会自动转换为字符串类型;

6. 必须满足转换前的数据类型的位数要低于转换后的数据类型。

以上这些基本规律,壹哥希望各位能够熟练的记住并运用,这是我们开发时的基本功哦。

3. 案例

为了能让大家更好地理解自动类型转换,壹哥给大家设计了如下配套代码案例,你必须手敲几遍哦。

public class TypeDemo04 {

	public static void main(String[] args) {
// 自动类型转换:小转大,自动转换,啥也不用做 // 1.byte-->short,可以
byte b = 19;
short s = b;
// short-->byte,不可以自动转换:Type mismatch: cannot convert from short to byte
// byte b2=s;
System.out.println("s=" + s); // 2.short-->int,可以
int i = s;
System.out.println("i=" + i);
// int-->short,不可以自动转换:Type mismatch: cannot convert from int to short
// short s2=i; // 3.char-->int,可以
char c = 'a';
int j = c;
System.out.println("j=" + j);
// int-->char,不可以自动转换:Type mismatch: cannot convert from char to int
// char c2=j; // 4.int-->long,可以
long x = i;
System.out.println("x=" + x);
// long-->int,不可以自动转换:Type mismatch: cannot convert from int to long
// j = x; // 5.int-->float,可以
float f1 = i;
System.out.println("f1=" + f1);
// float-->int,不可以自动转换:Type mismatch: cannot convert from float to int
// j = f1; // 6.int-->double,可以
double d1 = i;
System.out.println("d1=" + d1);
// double-->int,不可以自动转换:Type mismatch: cannot convert from double to int
// j = d1; // 7. long-->float,可以
float f2 = x;
System.out.println("f2=" + f2);
// float-->long,不可以自动转换:Type mismatch: cannot convert from float to long
// x = f2; // 8. long-->double,可以
double d2 = x;
System.out.println("d2=" + d2);
// double-->long,不可以自动转换:Type mismatch: cannot convert from double to long
// x = d2; // 9. float-->double,可以
double d3 = f1;
System.out.println("d3=" + d3);
// double-->float,不可以自动转换:Type mismatch: cannot convert from double to float
// f2 = d3;
} }

们要注意,超出范围的强制转型会得到错误的结果。因为转型时int的两个高位字节直接被扔掉,仅保留了低位的两个字节,因此强制转型的结果有可能是错的。

对于以上案例,壹哥希望大家动手敲起来,这些代码虽然看着简单,但只有你自己亲手练习了,你才能理解得更深刻。纸上得来终觉浅,绝知此事要躬行!

三、强制类型转换(显式转换)

1. 概念

所谓的强制类型转换,其实是自动类型转换的逆过程,在数据类型兼容的情况下,将容量大的数据类型转换为容量小的数据类型强制类型转换也被称为显式类型转换需要我们显式地进行转换操作,必须在=等号后面的类型前加上强制()转换符,并且有可能会造成数据精度的降低或溢出。

2. 转换规律

强制类型转换时,也具有一定的规律,但是这个规律比较简单。

1. 进行转换的数据类型必须是兼容的;

2. 通常,字符串不能直接转换为基本类型;

3. 通过基本类型对应的包装类,可以把字符串类型的数值转换成对应的基本类型。如String s = “100”; int i = Integer.parseInt(s);

4. boolean类型不可以转换成其他数据类型。

为了让大家更好地理解这些规律,壹哥还是给大家设计一些代码案例,往下看吧。

3. 案例

强制类型转换格式:(type)value其中type是要强制类型转换后的数据类型。

public class TypeDemo04 {

	public static void main(String[] args) {
// 强制类型转换:大转小。
double d1 = 100;
// double-->int,大转小,d1的类型为double,i的类型为int,需要强制转换,类型前添加(要转换成的类型)。
int i = (int) d1;
System.out.println("i=" + i); //int-->char,大转小
int j = 97;
char c1 = (char) j;
System.out.println("c1="+c1); //int-->byte,大转小,精度可能会丢失
int k =128;
//byte类型是8位,最大值为127,当int强制转换为byte类型时,128就会导致溢出变成-128。
byte b = (byte)k;
System.out.println("b="+b);//-128 //表达式中进行类型转换
double d2 = 10;
double d3 = 12;
int m = (int) (d2 + d3);
System.out.println("m="+m); //double+int,小类型和大类型进行计算,会进行类型提升,最终的结果变成大类型。
//Type mismatch: cannot convert from double to int
//int n = d2 + k;
int n = (int)d2 + k;
System.out.println("n="+n); //浮点数到整数的转换,是通过舍弃小数得到的,而不是四舍五入
int x=(int)55.9;//55
int y=(int)-28.89f;
System.out.println("x="+x+",y="+y);//-28
} }

大家要注意:

类型转换时可能会导致溢出或精度的丢失,另外浮点数到整数的转换是通过舍弃小数得到的,而不是四舍五入。我们可以看下图的执行结果:

4. 类型提升补充说明

在上面强制转换时,如果涉及到不同数据类型之间的数学运算,比如+、-、*、/等操作,大家要注意:小类型的数据和大类型的数据进行计算时,会自动进行类型提升,最终的结果变成大类型!关于这一块的内容,大家暂时先了解这么多,后面讲运算符时我再细说。

public class TypeDemo04 {

	public static void main(String[] args) {
// 强制类型转换:大转小
//类型提升
//double+int,小类型和大类型进行计算,会进行类型提升,最终的结果变成大类型。
//Type mismatch: cannot convert from double to int
//int m = d2 + k;
int m = (int)d2 + k;
System.out.println("m="+m);
} }

类型自动提升后,如果不进行强制类型转换,也是会出现如下异常:

四、隐含强制类型转换(初始化)

1. 概念

首先我们要知道这样的基本原则:

在变量初始化时,整数的默认类型都是int;

浮点型小数的默认类型是 double;

浮点型不存在隐含强制类型转换的情况,在定义 float 类型时必须在数字后面跟上 F 或者 f。

在 byte b = 100; 这句代码中,100 默认就是 int 类型!虽然100默认是int类型,但Java会把100隐含地强制转换成低级别的 byte 和 short 类型,所以不用我们进行显式的强制类型转换。也就是说,Java会把-128到127之间的int类型数据,都隐含地强制转换成低级别的byte和short类型。

2. 案例

public class TypeDemo04 {

	public static void main(String[] args) {
// 隐含强制类型转换,初始化时。
//100默认是int类型,
//虽然int>byte,但Java会把-128到127之间的数字,隐含强制转换成低级别的byte和short类型,
//所以不用我们进行显式的强制类型转换。
byte b = 100;
System.out.println("b=" + b); //b2=-129,b2=128都会报错,Type mismatch: cannot convert from int to byte。
//byte b2 = -129;
} }

五、其他类型转换

关于其他类型之间的转换,主要包括基本类型与字符串、基本类型与包装类、字符串与包装类、包装类与字符串之间的转换。接下来,壹哥再通过几个案例给大家展示一下它们的用法。

1. 基本类型转字符串

基本类型转字符串,对我们初学者来说,最常用的一个办法就是直接在基本类型后面加上一个双引号""。这种方案最简单,但实际上效率并不高,在进行大量字符串拼接时不建议采用这种方案。当然,如果只是个别字符串的拼接,采用这种方案是无所谓的。

public class TypeDemo04 {

	public static void main(String[] args) {
//1.基本类型转字符串
//变量+"",会自动转换String类型
int x = 111;
String s1 = x + "";
System.out.println("s1=" + s1);
} }

2. 包装类型转字符串

关于包装类,我们现在暂时先了解一下即可,在后面的章节中,壹哥会细讲。

public class TypeDemo04 {

	public static void main(String[] args) {
//2.包装类型转字符串
Double d = 1000.0;
String str = d.toString();
System.out.println("str=" + str);
} }

3. 字符串转包装类型

该案例大家也是先简单了解即可,后面我们再细讲。

public class TypeDemo04 {

	public static void main(String[] args) {
//3.字符串转包装类
Double d2 = Double.parseDouble("11.1");
Double d3 = Double.valueOf("11.1");
System.out.println("d2=" + d2 + ",d3=" + d3);
int i = Integer.parseInt("100");
Integer j = Integer.valueOf("200");
System.out.println("i=" + i + ",j=" + j);
} }

另外关于基本类型和包装类之间的转换,壹哥会在以后再讲解。

------------------------------正片已结束,来根事后烟----------------------------

六、结语

至此,壹哥就把自动类型转换、强制类型转换等类型转换相关的内容讲解完毕了,本文的重点有如下这些:

自动类型转换的规律;

强制类型转换的规律;

隐含强制类型转换。

七、今日作业

第一题

请问 byte b = 3; b = b +4;这样的代码有没有问题?

第二题

请问 byte b = 5; short s = 3; short t = s + b; 能不能编译通过?评论区告诉我吧

java数据类型转换有哪几种?看这篇就够了!的更多相关文章

  1. 面试中关于Java虚拟机(jvm)的问题看这篇就够了

    最近看书的过程中整理了一些面试题,面试题以及答案都在我的文章中有所提到,希望你能在以问题为导向的过程中掌握虚拟机的核心知识.面试毕竟是面试,核心知识我们还是要掌握的,加油~~~ 下面是按jvm虚拟机知 ...

  2. Java数据类型转换浅析

    Java数据类型转换分为两种:自动类型转换和强制类型转换. 数据类型转换的关键是数据类型相应的表数范围大小 1.自动类型转换: 概念:小范围数据类型会自动转化成大范围数据类型 实例: int a=10 ...

  3. Java数据类型转换1

    1 如何将字串 String 转换成整数 int? A. 有两个方法: 1). int i = Integer.parseInt([String]); 或 i = Integer.parseInt([ ...

  4. Python GUI之tkinter窗口视窗教程大集合(看这篇就够了) JAVA日志的前世今生 .NET MVC采用SignalR更新在线用户数 C#多线程编程系列(五)- 使用任务并行库 C#多线程编程系列(三)- 线程同步 C#多线程编程系列(二)- 线程基础 C#多线程编程系列(一)- 简介

    Python GUI之tkinter窗口视窗教程大集合(看这篇就够了) 一.前言 由于本篇文章较长,所以下面给出内容目录方便跳转阅读,当然也可以用博客页面最右侧的文章目录导航栏进行跳转查阅. 一.前言 ...

  5. C#实现多级子目录Zip压缩解压实例 NET4.6下的UTC时间转换 [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了 asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程 asp.net core异步进行新增操作并且需要判断某些字段是否重复的三种解决方案 .NET Core开发日志

    C#实现多级子目录Zip压缩解压实例 参考 https://blog.csdn.net/lki_suidongdong/article/details/20942977 重点: 实现多级子目录的压缩, ...

  6. .NET Core实战项目之CMS 第二章 入门篇-快速入门ASP.NET Core看这篇就够了

    作者:依乐祝 原文链接:https://www.cnblogs.com/yilezhu/p/9985451.html 本来这篇只是想简单介绍下ASP.NET Core MVC项目的(毕竟要照顾到很多新 ...

  7. ExpandoObject与DynamicObject的使用 RabbitMQ与.net core(一)安装 RabbitMQ与.net core(二)Producer与Exchange ASP.NET Core 2.1 : 十五.图解路由(2.1 or earler) .NET Core中的一个接口多种实现的依赖注入与动态选择看这篇就够了

    ExpandoObject与DynamicObject的使用   using ImpromptuInterface; using System; using System.Dynamic; names ...

  8. [转帖]Zookeeper入门看这篇就够了

    Zookeeper入门看这篇就够了 https://my.oschina.net/u/3796575/blog/1845035 Zookeeper是什么 官方文档上这么解释zookeeper,它是一个 ...

  9. net core体系-web应用程序-4asp.net core2.0 项目实战(CMS)-第二章 入门篇-快速入门ASP.NET Core看这篇就够了

    .NET Core实战项目之CMS 第二章 入门篇-快速入门ASP.NET Core看这篇就够了   原文链接:https://www.cnblogs.com/yilezhu/p/9985451.ht ...

  10. Vue学习看这篇就够

    Vue -渐进式JavaScript框架 介绍 vue 中文网 vue github Vue.js 是一套构建用户界面(UI)的渐进式JavaScript框架 库和框架的区别 我们所说的前端框架与库的 ...

随机推荐

  1. calibredrv 对layer做操作

    #clip.tclset L [layout create xxx.gds] $L create layer 10.0 $L create polygon 10.0 10 1000 1000 2000 ...

  2. bzoj 2337

    有人说这题像游走... 关于游走的思想,他死了... 明明直接从期望dp的角度考虑更简单合理嘛 首先由于是异或运算不妨逐位考虑 对于每一位,设状态$f[i]$表示从第$i$个点到第$n$个点,这一位上 ...

  3. Idea提交文件时,添加不需要提交的文件至.gitignore文件中

    1.在Idea中,依次打开File ---->Setting ---> Editor --->File Types 2.在当前编辑栏下方找到Ignore files and fold ...

  4. 关于pandas的一些用法

    pandas用法之前我总是把他想的无比复杂.其实也是比较简单的,这个东西在做数据统计的时候还是挺好用的. 然后这里列举几个比较好用的几段代码.偏向数据透视类型pivot的,导出方式是直接在IDE 生成 ...

  5. javaScript事件onmouseout 、 onmouseove

    javaScript事件onmouseout . onmouseove onmouseout: 鼠标从某元素移开 onmouseover: 鼠标被移到某元素之上 这两个事件是鼠标滑过元素是的效果,可以 ...

  6. Shell脚本结构化-控制流

    脚本结构化命令 上一章给出的那些 shell 脚本里,shell 按照命令在脚本中出现的顺序依次进行处理.对顺序操作来说,这已经足够了,因为在这种操作环境下,你想要的就是所有的命令按照正确的顺序执行. ...

  7. Linux系统管理实战-软件包管理

    软件包管理 在Linux中,不同的发行版软件管理的方式可能不一样,具体来说,主要分为两大派: RPM: Rpm Package Manager CentOS系统软件安装三种方式 rpm:安装简单,可定 ...

  8. 接口文档API、剖析http协议, 原生http请求函数

    http协议:超广本传输协议 特点: 短连接 请求完成后就断开 无状态  对于事务处理无记忆能力 媒体独立 客户端要指定适合的传输内容类型,如json http  是建立在tcp/ip协议之上的应用层 ...

  9. 十大经典排序之堆排序(C++实现)

    堆排序 通过将无序表转化为堆,可以直接找到表中最大值或者最小值,然后将其提取出来,令剩余的记录再重建一个堆, 取出次大值或者次小值,如此反复执行就可以得到一个有序序列,此过程为堆排序. 思路: 1.创 ...

  10. Jmeter检查点

    一.Response Assertion(响应断言) 1. 添加响应断言 对Web请求的响应结果进行验证,Response Assertion配置参数 2. 输入需要匹配的字符串 此处对于访问Baid ...