java中的类型自动转换机制解析
目录
- 类型自动转换机制解析
- 概述
- 数据类型只会自动提升,不能自动降低
- Java中整数默认的数据类型是int类型
- 自动类型转换&强制类型转换
- 什么时候会发生类型转换
- 类型转换分类
- 自动类型转换(隐式类型转换)
- 强制类型转换(显式类型转换)
类型自动转换机制解析
概述
- 自动类型转换也叫隐式类型转换
- 表达式的数据类型自动提升
如果一个操作数是long型,计算结果就是long型;
如果一个操作数是float型,计算结果就是float型;
如果一个操作数是double型,计算结果就是double型。
数据类型只会自动提升,不能自动降低
int值可以赋值给long、float、double型变量,不能赋值给byte、short、char型变量
文章图片
对于函数的传参也是一样
文章图片
当然,在有函数重载的情况下,java编译器会自动选择最匹配的函数进行调用
文章图片
Java中整数默认的数据类型是int类型
所有长度低于int的类型(byte、short、char)在运算之后结果将会被提升为int型
文章图片
当然还有以下的这种情况,这种情况是因为我们在进行赋值运算的时候,java编译器可以明确知道运算的结果是否超过byte或short的取值范围,所以 byte a = 1 + 1; 并没有报错。而上面 byte c = a + b; 编译出错的原因是因为a和b均为一个变量,相加的结果是否会超过byte的取值范围编译器并不知道,所以编译器将结果提升为int型了。
文章图片
小结一下:
- 当编译器明确知道整数的运算结果没有到达int的表示范围时,byte、short或char类型的运算结果不会被自动提升为int类型
- 当编译器明确知道或不清楚整数的运算结果是否到达int的表示范围时,编译器将会自动将运算的结果转换成int,即使原来是byte、short或char类型。
自动类型转换 & 强制类型转换
什么时候会发生类型转换
答: 赋值 | 运算时 ,两边数据类型不一致时就会发生类型转换
如下:
public class TypeTest {public static void main(String[] args){// 运算时发生的隐式类型转换,两整数相除得到的还是一个整数byte a= 3; byte b = 4; int num=a + b; System.out.println(num); // 7// 赋值时发生的隐式类型转换int ch = '0'; System.out.println(ch); // 48// 运算时发生的强制类型转换byte a1 = 12; byte a2 = 12; byte num1 = (byte)(a1+ a2); System.out.println(num1); // 24// 赋值时发生的强制类型转换short b3 = 1234; byte a3 = (byte) b3; System.out.println(a3); // -46}}
运行截图:
文章图片
类型转换分类
- 自动类型转换
- 强制类型转换
自动类型转换(隐式类型转换)
规则:从小到大 ,低字节向高字节自动提升
顺序:
byte(1字节) – > short(2字节)-- > int(4字节) – > long(8字节) --> float(4字节) – > double(8字节)
char (2字节)-- > int(4字节) – > long(8字节) --> float(4字节) – > double(8字节)
画图分析:
文章图片
代码展示:
public class TypeDemo {public static void main(String[] agrs){// byte -- > shortbyte b1 = 127; short s1 = b1; System.out.println(s1); // 127// short -- > int shorts2 = 30000; int i = s2; System.out.println(i); // 30000// int-- > longint num = 2100000000; long lg = num; System.out.println(num); // 2100000000// long -- > float long lg1 = 200000000000000L; float f1 = lg1; System.out.println(f1); // 2.00000001E14// float -- > double float f2 = 3.14f; double d1 = f2; System.out.println(d1); // 3.140000104904175// char -- > intchar ch = 'a'; int i1 = ch ; System.out.println(i1); // 97// char -- > longchar ch1 = 'b'; long lg2 = ch1; System.out.println(lg2); // 98// char-- >doublechar ch2 = 'c'; double dou = ch2; System.out.println(dou); // 99.0// char -- > floatchar ch3 = 'd'; floatf3 = ch3; System.out.println(f3); // 100.0}}
运行截图:
文章图片
注意:
byte、short不能和char进行相互转换
代码展示:
public class TypeDemo2 {public static void main(String[] agrs){// byte -- > charbyte bt = 127; char ch = bt; System.out.println(ch); // short -- > charshort sh = 12; char ch1 = sh; System.out.println(ch1); }}
编译错误截图:
文章图片
float虽然是4个字节,但是float比long表示的数据范围更大。说明数据范围的大小和字节的大小不一定相关
代码展示:
public class TypeDemo3 {public static void main(String[] agrs){long lg = 20000000000000L; float f1 = lg; System.out.println(f1); // 1.99999997E13}}
运行截图:
文章图片
boolean类型不能参与类型转换
代码展示:
public class TypeDemo4 {public static void main(String[] agrs) {boolean flag = 12; int flag1 = flag; System.out.println(flag1); }}
编译错误截图:
文章图片
强制类型转换(显式类型转换)
规则:从大到小,高字节向低字节手动强制转换
顺序:
double(8字节) – > float(4字节) – > long(8字节) – > int(4字节) – > short (2字节)-- > byte(1字节)
double(8字节) – > float(4字节) – > long(8字节) – > int(4字节) – > char(2字节)
画图分析:
文章图片
(掌握)格式:目标数据类型 变量名 = (目标数据类型) 变量 | 常量;
代码展示:
public class TypeDemo5 {public static void main(String[] agrs){// float -- > long// final floatPI = 3.14f; // long num = (long) PI; // 3// float little =3.14f; // long num = (long)little; // 3long num = (long)3.14f; System.out.println(num); // 3 // double -- > float // double dou = 3.14; // float little1 = (float)dou; // 3.14//float little1 = (float) 3.14d; // 3.14final doubledou = 3.14; float little1 = (float)dou; System.out.println(little1); // 3.14// long -- > int // longnum1 = 2000000000000L; // intnum2 = (int)num1; // -1454759936// int num2 = (int)2000000000000L; // -1454759936finallong num1 = 2000000000000L; int num2 = (int)num1; System.out.println(num2); // -1454759936// int --> short// intnum3= 12; // short num4 = (short)num3; // 12// short num4 = (short)40000; // -25536final int num3 = 60; short num4 = (short)num3; System.out.println(num4); // 60// short -- > bytefinal short sh = 12345; byte bt = (byte)sh; System.out.println(bt); // 57short sh1 = 78; bt = (byte) sh1; System.out.println(bt); // 78}}
运行截图:
文章图片
注意:
强制类型转换有数据丢失,一般不建议使用
代码展示:
publicclass TypeDemo6 {public static void main(String[] agrs) {short a = 1245; byte b = (byte)a; System.out.println(b); } }
运行截图:
文章图片
【java中的类型自动转换机制解析】以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
推荐阅读
- linq中的分区操作符
- 如何在|如何在 SAP BTP Java 应用里使用 SQLite 数据库
- 使用|使用 SAP BTP 创建一个 Spring Boot Java 应用
- sequelize|sequelize 增加数据库字段_使用Sequelize定义Model模型时设置列数据类型为Sequelize.JSON始终报错,数据库为mysql,求助大佬们(...)
- redis|2021-11-13 记录(Java连接远程Redis的报错信息和解决办法)
- Java|Java-抽象类与接口
- 笔记|R语言画图 | 如何看已知基因list的细胞类型特异性表达()
- 拓端tecdat|【视频】LSTM神经网络架构和原理及其在Python中的预测应用|数据分享
- 面试官(Redis中集合数据类型的内部实现方式是什么())
- 线性代数在前端中的应用(二)(实现鼠标拖拽旋转元素、Canvas图形)