类型转换

首先要明白,在基本类型数据当中,强制类型转换只发生在int、long、float和double之间。比int类型低或就是int型的像byte型、short型、char型、int型之间的转换不需要强制类型转换,也不存在着运算优先级和类型转换的问题,这是java官方规定的,你无权修改。至于运算后的结果是否能够被左边的类型容纳,你在输入的时候就能知道。

int以下的数据类型(精度小于int)运算的时候都会被自动转换为int后进行计算

char b='a'+18; 在运算的时候'a'自动类型提升为int, 加上18也为int类型,用char接收不报错是因为'a'+18相加的值在char类型范围里面,隐式向下转型为char类型,如果把18换成65534就会报错丢失精度了,这个时候就得需要强转或者用int类型来接收。

char a = 'a'; char b = a + 18; 这样报错是因为char b = a + 18中的a为变量,为变量则类型存在不确定性,变量a加上18的类型就不确定,所以会报错有可能丢失精度,需要强转。如果把char a = 'a'加上final则不会报错了,即为final char a = 'a';可见两者的差别,第一个是两个常量相加,第二个是一个变量加上一个常量。

其实char a和'a'不是一回事。就像'a'+18 和b+18不是一回事一样。'a'这个东西是一个常量值(你不要看到'a'就以为它是char类型,其实这里写'a'和97是一样的,默认都是int类型的常量,仅仅加上单引号是为了告诉我们这里面只能放char规定范围的数值)。而你定义了char a='a'这就不一样了,这个a是变量,仅仅是把常量的值赋给变量,这个是'a'这个int值传递给了char,这时候a就是char类型了。char类型与18进行运算,当然得到的结果就是int型,而且必须是int型的内存块。

‘a’+18其实是两个int型的常量进行运算,然后生成一个新的int类型的常量。传递给b的是一个常量值(常量不可改变,变量可以改变),常量的值赋给变量,不存在强制转换,只要这个变量的类型值能够容纳这个新的常量即可。理解这个,你就需要理解常量不可改变这一点上,两个新的常量相加会生成一个新的常量。而变量与常量相加会形成一个新的变量值。

而a+18,其实a已经分配了一个内存空间用存放char类型变量a(记着,a是变量,值可以改变,常量值不可以改变,而且a是char类型),然后把a复制一份放到内存,然后用复制的值的与int类型的常量18进行运算,这时候生成是一个变量值(没有标注,但是一定有一个变量来存放它),然后把这个变量值赋给变量b,因为是变量,存在着类型转换问题。原理是因为a与18分别处于不同的内存块当中,这时候传递给b的是2个内存空间的值,这时候就存在着转换问题了。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值