Java新手 自动类型转换 表达式类型的自动提升 这两者怎么区别

2024-11-25 16:07:21
推荐回答(2个)
回答1:

通过一个经典的例子给你说吧

short i=1,j=i+1;

首先这个表达式是错误的,为什么呢?

  1. 在i+1表达式中,1为int类型,所以这里的i会被自动提升为int类型(自动提升:多种不同数据类型的表达式中,类型会自动向范围比较大的值的数据类型提升。)

  2. 在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的范围,可能会溢出

回答2:

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