基本类型转换
- 1、自动类型转换
- 2、强制类型转换
1、自动类型转换
定义:当Java程序在进行赋值或者运算时,精度小的类型会自动转换成精度大的数据类型,这个就是自动类型转换。(自动小转大)
背多芬:
这里要明确一个概念:高司令当初创建Java的时候规定char 和 byte、short是不能自动转换,所以这是Java语言的规则,我们记住就可以了。
另外,Boolean在Java中只有true和false,没有0/1,所以不参与类型转换。
在long(8字节)可以转换成float(4字节)中,我其实查了一些资料,就我个人理解:应该是因为float采用科学计数法,本身精度就大,所以能自动转换。(感兴趣的可以自己去查一下哈,我不太感兴趣,所以直接背喽😁)
使用细节:
①有多种类型数据一起进行混合运算时,系统首先自动将所有数据转换成容量最大的数据类型,然后再进行计算。
int n1 = 10;
float f1 = n1 + 1.1F; //float
System.out.println("f1 = "+f1);
double d1 = n1 + 1.1; //double
System.out.println("d1 = "+d1);
结果:
分析一下: 第二条语句中参与运算的有int 和 float,所以 int类型 先转换成 float类型,再进行运算(注意:此处 1.1 一定要加 ‘ F ’,不然系统会默认为double,然后报错,所以变量最终的类型精度要大于或等于运算结果的精度),第四条语句同上。
②当我们把精度(容量)大的数据类型赋值给精度(容量)小的数据类型时,就会报错,反之就会进行自动类型转换。
小 ----自动类型转换----> 大
大 ----强制类型转换----> 小
③(byte,short)和char之间不会自动转换。
④byte,short,char三者任意可以进行计算,在计算时首先转换为int类型。
char c1 = 1;
byte b1 = 1;
byte b2 = 2;
short s1 = 1;
int x = c1 + b1;
System.out.println("c1 + b1 = " + x);
int y = b1 + b2;
System.out.println("b1 + b2 = " + y);
long z = c1 + b1 + s1;
System.out.println("c1 + b1 + s1 = " + z);
结果:
我们可以从溢出角度理解,假设两个byte类型、赋值为127的变量相加,那么结果是254,而byte是一个字节,范围是(-128~127,这里指的是有符号整数,即最高位为符号位),如果仍然存进byte类型,就会溢出。同理,这三者任意搭配都有可能出现溢出的情况,因此直接拿精度(容量)较大的int类型去装它们,可以避免这种情况的发生。
⑤Boolean类型不参与转换。
前面提过了,Java中Boolean只有true和false的取值,没有0/1,所以不能自动转换。
2、强制类型转换
定义:自动类型转换的逆过程,将容量大的数据类型转换成容量小的数据类型。使用时要加上强制转换符(),eg:(int),(float)…但可能造成精度降低或溢出,格外要注意。
上代码:
结果:
分析一下:
Ⅰ、(int)1.9很明显损失了精度,不赘述了。
Ⅱ、用(byte)把 int类型进行强制转换,系统首先会判断这个将要存进的数的大小,若在byte精度范围里面,则可以存进去;若超出了精度范围,就会出现第三种情况,造成数据溢出。(其他强制转换也是如此。)
使用细节:
①强制符号()只针对最近的操作数有效,往往会使用小括号提升优先级。
来练习一下吧:
short s = 12; //ok
s = s - 9; //错误,int -> short
byte b = 10; //ok
b = b + 11; //错误,int -> byte
char c = 'a'; //ok
int i = 16; //ok
float d = .314F; //ok
double result = c + i + d; //ok, float -> double
本人正在B站跟着韩顺平老师学Java(非广告),所以做个笔记仅供学习,文章虽标为原创,但大体思路是韩顺平老师的授课思路,在此基础上加上了自己的理解,不喜勿喷哦。
大家一起学,一起进步!!
各位宝子们如果觉滴还不错的话,可以点个赞 or 收个藏 or 打个赏哦,佛系博主一个。