Java是强类型语言,所以要进行有些运算的时候需要类型转换,java在做运算的时候需要将不同类型的数据转换成同一类型进行计算。
Java数据类型的转换有两种形式:
1,强制类型转换:
2,自动类型转换:
什么是强类型转换和自动类型转换?上一篇中已经介绍的数据类型,其实数据类型是由优先级的。优先级的高低也就决定了你要做的类型转换是强制类型转换还是自动类型转换。
(低)---------------------------------------------------------->(高)
byte,short,char-->int --->long--->float--->double
优先级有低到高转换为自动类型转换,有高到低转换为强制类型转换
下面我们就据一些例子:
有高到低之间的转换:int---->byte
有低到高之间的转换:byte---->int
public class MyJava { public static void main(String[] args) { //有高到底转换 int a=1; byte b=(byte) a; //有低到高转换 byte c=10; int d=c; //输出 System.out.println(b); System.out.println(d); } }
上面的程序看上去好像没有上面问题,但是在进行强转换类型的时候,不明白的人可能会踩坑。接下来我将上面的程序稍作修改,运行后你就能看到结果了。
public class MyJava { public static void main(String[] args) { //有高到底转换 int a=128; byte b=(byte) a; //有低到高转换 byte c=10; int d=c; //输出 System.out.println(b); System.out.println(d); } }
这是什么鬼?为什么经过强类型转换后128变成了-128呢?其实上一篇在介绍数据类型的时候就已经给出答案:
看到byte范围了没有?最大到127,而我给int类型赋的值是128超出了他的范围,所以经过强制类型转换后两个数值不一样了。我们通常把这成为内存溢出。
我们在接着做类型转换的测试:
public class MyJava {
public static void main(String[] args) {
float a=20.1f;
int b=(int)a;
double c=3.1415926;
int d=(int) c;
//输出
System.out.println(b);
System.out.println(d);
}
}
上面的两次转换都是自动类型转换,但是我们会发现前后转换数值也不相等,这又是什么原因呢?不用想了,一个是float和double都是表示小数的,而int类型是整数型肯定不能带小数。所以进行转换的时候只能去掉小数点后面的部分直接取整了。这种情况我们一般称为精度问题了。
接下来我们接着做数据类型转换的测试:
public class MyJava { public static void main(String[] args) { char a='a'; int b=a+1; //输出 System.out.println(b); } }
???为什么变成98了,什么鬼?其实就是ASCII码,不了解的可以百度科普一下就行了。a的ASCII码是97,那么在加上1自然就是98了。
接下来就是布尔值了,注意:不能对布尔值进行转换,因为布尔值只有两种结果,true和false。
关于数据类型转换经过测试,我们应该可以总结出关于数据类型转化的注意要点了:
1,不能把对象类型转换为不相干的类型。(类型之间的转换一定是同一性质的。就好比人永远转换不成猪,但是男和女可以转换。哈哈哈)
2,把高容量转换成低容量的时候强制转换。
3,转换的时候可能存在内存溢出和精度问题。