在数据类型那章我们学习了java的八大基本类型,我们发现。除了boolean类型,其它的几种类型都是数(char类型也可以看成是数)。那么既然都是数,那么他们之间能不能相互转换呢?
基本类型之间的转换我们分为以下几种情况
- 小范围向大范围转换
- 大范围向小范围转换
- 低精度向高精度转换
- 高精度向低精度转换
- 基本类型向字符串转换
- 基本类型向类类型转换
- 类类型向字符串转换
由于目前所学知识的限制,我们今天只讲去前五种情况。
首先,我们来看看第一种情况:小范围向大范围转换
这里的小范围和大范围指的是数据的范围,都是相对的概念,比如int相对于Long就是小范围,相对于byte就是大范围。
现在,我们有一个int类型的变量a,给它 赋值为10,然后我们再申明个long类型的变量b,然后我们把a赋值给b,我们输出一下b的值,这就是第二种情况,大范围向小范围转换:
- int a = 1;
- long b = a;
- System.out.println(b);
你会发现这跟普通的赋值好像没有什么区别。这是因为long类型的范围本来就比int大,jvm虚拟机自动就处理了(神器的jvm),就好比把小盒子里的东西放到大盒子,直接倒进去就行了。 如果我们反过来试一下,会发现: a处报了错,说明编译没通过,鼠标放在a上,立马显示了错误提示
- Type mismatch: cannot convert from long to int
意思是不能将int类型转换为long类型,并且给出了三个解决方案,我们点一下“add cast to int这个”,这个方案是讲a强转成int(另外两种大家可以自己试一试),于是代码变成了:
- long a = 1l;
- int b = (int) a;
- System.out.println(b);
没错,在变量前面加上(int)就完成了强转。 但是,我们前面提到long范围比int类型的大,还用盒子做了比喻,有的童鞋可能会问:如果大盒子里的东西超出小盒子储存的范围会怎样?比如我a的值一开始就弄个10000000000l,我们来看代码:
- long a = 10000000000l;
- int b = (int) a;
- System.out.println(b);
运行的结果却是1410065408,当然,再多加几个0可能还会变成负数,这结果显然不对啊。这是因为long存放的东西超出了int能接受的范围,导致内存溢出了,具体的原理需要讲到底层二进制代码,有兴趣的童鞋可以自己去查查资料。 由以上两条可以总结出:
- 范围小的数转范围大的数可以直接转换
-
范围大的数转范围小的数需要强转,如果范围大的数的值超出的范围小的数的值,则会导致内存溢出 接下来我们看看低精度向高精度转换:
- float a = 1.23f;
- double b = a;
- System.out.println(b);
- double a = 1.23d;
- float b = (float) a;
- System.out.println(b);
- double a = 1.255555555555555d;
- float b = (float) a;
- System.out.println(b);
- 低精度的数转高精度的数可以直接转换,转换的结果比低精度的数经度高
- 高精度的数转低精度的数需要强转,如果高精度的数超过了低精度数的经度会保留高精度数在低精度中的最大位数
当然,我们的int,long byte等等可以看成是精度为0的小数,因此也符合这个以上两条规则 还记得在讲字符串的时候,我们讲过这样一个例子:
- int a = 1;
- int b = 2;
- System.out.println(""+a+b);
当时讲过这个输出的结果为什么么是12而不是3,原因是当前面拼接上了字符串之后,后面的会自动被强转为字符串拼接起来,那么基本类型向字符串转换这个情况的规律就是:
- 基本类型需要转成字符串时,在基本类型的前面拼接一个字符串即可。
那么为什么是在前面拼接不能在后面拼接呢?我们可以运行下面代码做个试验:
- int a = 1;
- int b = 2;
- System.out.println(a+b+""+a+b);
相信看到结果“312”的你应该懂了吧。