通过一个经典的例子给你说吧
short i=1,j=i+1;
首先这个表达式是错误的,为什么呢?
在i+1表达式中,1为int类型,所以这里的i会被自动提升为int类型(自动提升:多种不同数据类型的表达式中,类型会自动向范围比较大的值的数据类型提升。)
在j=i+1中,i+1的结果为2(int类型),这里要把int类型的结果赋值给short类型的i,就需要把int类型的2转换为short类型(自动类型转换:数字表示范围小的数据类型可以自动转换成范围大的数据类型),但是这里int类型范围比short类型的大,就不能进行自动转换
上面的表达式再分解一下:
short i=1;
int j=i+1; // 自动提升:i原来为short类型,但在表达式i+1中为正确运算会被自动提升为int类型
i=j; // 自动转换:无法自动转换,因为j是int类型,不能向更小范围的short类型转换
扩展:
long a=j; // 自动转换:可以自动转换,因为j是int类型,可以向更大范围的long类型转换
short b=(short)j; // 强制转换:可以向更小范围的short进行强制转换,但如果j的值超过了short的范围,可能会溢出
Java语言提供的7种数值类型转换有两种方式:自动类型转换和强制类型转换。 一、自动类型转换
表数范围小的可以直接自动转换成表数范围大的
具体例子不祥写了,唯独需要注意的是:把任何基本类型的值和字符串值进行连接运算时,基本类型的值将自动类型转换为字符串,就像上一篇里面的例子,boolean值转换成字符串
方法就是把基本类型的值和空字符串用+进行连接即可
解释:第一个会执行3+4,两个整数之间的加法运算,最后变成7+”Hello!“,这是由于后面跟了字符串,所以加号在这里充当连接的作用,把7转换成了字符串;
至于第二个,因为第一个就是字符串”Hello!“,那么紧挨着的加号就又充当了连接的作用,所以后面的3就转换成了字符串形式,即Hello!3,那么同理,在其后面紧挨的加号又是连接的作用,所以4也被当成字符串。
二、强制类型的转换
如果要把上面的图片中,箭头右边要转换成左边的类型,就需要强制转换。通俗的说就是大瓶子的水倒在小瓶子里;
缩小转换(Narrow Conversion):如果大瓶子里的水很多,那么倒在小瓶子里就会溢出,引起数据丢失。
//强制转换的规范定义
int iValue = 233;
byte bValue = (byte)iValue;
以及经常出错的代码:
//因为默认5.6是double类型,所以会出错
float a = 5.6;
//正确的改法之方法一:
float a = (float)5.6;
//方法二:
float a = 5.6f