Java类型转换最常遇到的两个问题:
先来看一段代码:
int i = 128; byte b = (byte)i; System.out.println(i);//128 System.out.println(b);//-128
这是一个典型的内存溢出现象:我们可以查看Byte类型的底层代码,可以看到Byte的最大值是127,最小值是-128,当将128赋值给byte类型的b时,就会出现内存溢出,所以输入答案不为128为-128.而至于为什么是-128不是其他,这个就留到后面解答.
再看下面一段代码:
System.out.println((int)23.7);//23 System.out.println((int)-25.78f);//-25
这是另一个典型的精度问题,我们可以看到进行强制类型转换的时候精度可能会存在问题,会出现丢失.
从上面我们可以引出类型转换,按照分类,类型转换分为强制类型转换和自动类型转换:
在讨论这个问题之前我们需要先知道java不同的类型之间是有优先级之分的:
从低到高排序 : byte->short->char->int->long->float->double
由此我们可以得出他们对应的定义:
强制类型转换:就是类型优先级从高需要变低,就需要强制类型转换
自动类型转换:就是类型转换的优先级是从低到高,将会自动转换
综上我们得出几点结论:
1.不能对布尔值进行转换
2.不能把对象类型转换成不相干的类型
3.在把高优先级转换到低优先级类型时,要强制转换,反之则会自动类型转换
4.转换的时候可能存在内存溢出,或者精度问题
看完上面,我们再来看一段代码,看看你是不是真的掌握了:
//操作比较大的数的时候,注意溢出问题 int money = 10_0000_0000;//JDK7的新特性,数字之间可以用下划线分割 int year = 20; int total = money*year; System.out.println(total);//-1474836480 long total2 = money*year; System.out.println(total2);//-1474836480 long total3 = money*((long)year);//20000000000
从上面的代码我们不难知道,数据类型转换在具体的代码中需要在合适的地方进行正确的类型转换,才能到达我们想要的效果,这个是需要我们不断加强,真正掌握类型转换的本质,这个过程我们可以时刻关注两个问题,从这两个问题的角度去发现问题,纠正问题,那么后面更复杂的类之间的类型转换也就不会有什么问题了!