原创声明:本文为作者原创,未经允许不得转载,经授权转载需注明作者和出处
在数据类型那章我们学习了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
意思是不能将long类型转换为int类型,并且给出了三个解决方案,我们点一下“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);
我们的运行结果是1.2300000190734863,我们的1.23可以看成是这个数四舍五入之后保留两位小数之后留下来的,这就说明,这个数的精确度比1.23高,所以结果是对的。double a = 1.23d;
float b = (float) a;
System.out.println(b);
结果自然毫无疑问是1.23,那么其实我们的高低精度转换也可以看成是大小盒子的问题,那么会和long转int一样出现内存问题么,比如:double a = 1.255555555555555d;
float b = (float) a;
System.out.println(b);
可以根据我们的运行结果“1.2555555”看出,并不会出现这个问题,后面的位数数被我们神奇的jvm虚拟机自动去掉了。当然,我们的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”的你应该懂了吧。